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

Release-1.3.6-20040324

parent ce05925c
DOXYGEN Version 1.3.6-20040307
DOXYGEN Version 1.3.6-20040324
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (07 March 2004)
Dimitri van Heesch (24 March 2004)
DOXYGEN Version 1.3.6_20040307
DOXYGEN Version 1.3.6_20040324
Please read INSTALL for compilation instructions.
......@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (07 March 2004)
Dimitri van Heesch (dimitri@stack.nl) (24 March 2004)
1.3.6-20040307
1.3.6-20040324
......@@ -147,6 +147,7 @@ documentation:
\refitem cmdlt \\\<
\refitem cmdgt \\\>
\refitem cmdhash \\\#
\refitem cmdperc \\\%
\endsecreflist
The following subsections provide a list of all commands that are recognized by
......@@ -1956,6 +1957,15 @@ class C {};
\f$\mbox{\LaTeX}\f$ output. This
character has to be escaped because it has a special meaning in HTML.
\section cmdperc \%
\addindex \\\%
This command writes the \% character to the HTML and
\f$\mbox{\LaTeX}\f$ output. This
character has to be escaped in some cases, because it is used to
prevent auto-linking to word that is also a documented class or struct.
<hr>
<hr>
<h2>\htmlonly <center> --- \endhtmlonly
Commands included for Qt compatibility
......
......@@ -71,6 +71,7 @@ followed by the descriptions of the tags grouped by category.
\refitem cfg_cols_in_alpha_index COLS_IN_ALPHA_INDEX
\refitem cfg_compact_latex COMPACT_LATEX
\refitem cfg_compact_rtf COMPACT_RTF
\refitem cfg_create_subdirs CREATE_SUBDIRS
\refitem cfg_details_at_top DETAILS_AT_TOP
\refitem cfg_disable_index DISABLE_INDEX
\refitem cfg_distribute_group_doc DISTRIBUTE_GROUP_DOC
......@@ -233,6 +234,16 @@ followed by the descriptions of the tags grouped by category.
If a relative path is entered, it will be relative to the location
where doxygen was started. If left blank the current directory will be used.
\anchor cfg_create_subdirs
<dt>\c CREATE_SUBDIRS <dd>
\addindex CREATE_SUBDIRS
If the \c CREATE_SUBDIRS tag is set to \c YES, then doxygen will create
2 levels of 10 sub-directories under the output directory of each output
format and will distribute the generated files over these directories.
Enabling this option can be useful when feeding doxygen a huge amount of source
files, where putting all generated files in the same directory would otherwise
causes performance problems for the file system.
\anchor cfg_output_language
<dt>\c OUTPUT_LANGUAGE <dd>
\addindex OUTPUT_LANGUAGE
......
Summary: A documentation system for C/C++.
Name: doxygen
Version: 1.3.6_20040307
Version: 1.3.6_20040324
Release: 1
Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
......
......@@ -1186,7 +1186,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
ol.writeString("<center><font size=\"2\">[");
ol.startHtmlLink("graph_legend"+Doxygen::htmlFileExtension);
ol.startHtmlLink(relativePathToRoot(0)+"graph_legend"+Doxygen::htmlFileExtension);
ol.docify(theTranslator->trLegend());
ol.endHtmlLink();
ol.writeString("]</font></center>");
......@@ -1220,7 +1220,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
{
ol.disableAllBut(OutputGenerator::Html);
ol.writeString("<center><font size=\"2\">[");
ol.startHtmlLink("graph_legend"+Doxygen::htmlFileExtension);
ol.startHtmlLink(relativePathToRoot(0)+"graph_legend"+Doxygen::htmlFileExtension);
ol.docify(theTranslator->trLegend());
ol.endHtmlLink();
ol.writeString("]</font></center>");
......
......@@ -1319,18 +1319,29 @@ void Config::create()
"where doxygen was started. If left blank the current directory will be used.\n"
);
cs->setWidgetType(ConfigString::Dir);
cb = addBool(
"CREATE_SUBDIRS",
"If the CREATE_SUBDIRS tag is set to YES, then doxygen will create \n"
"2 levels of 10 sub-directories under the output directory of each output \n"
"format and will distribute the generated files over these directories. \n"
"Enabling this option can be useful when feeding doxygen a huge amount of source \n"
"files, where putting all generated files in the same directory would otherwise \n"
"cause performance problems for the file system. \n",
FALSE
);
cb->addDependency("GENERATE_HTML");
ce = addEnum(
"OUTPUT_LANGUAGE",
"The OUTPUT_LANGUAGE tag is used to specify the language in which all \n"
"documentation generated by doxygen is written. Doxygen will use this \n"
"information to generate all constant output in the proper language. \n"
"The default language is English, other supported languages are: \n"
"Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, \n"
"Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en \n"
"(Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, \n"
"Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.\n",
"English"
);
"OUTPUT_LANGUAGE",
"The OUTPUT_LANGUAGE tag is used to specify the language in which all \n"
"documentation generated by doxygen is written. Doxygen will use this \n"
"information to generate all constant output in the proper language. \n"
"The default language is English, other supported languages are: \n"
"Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, \n"
"Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en \n"
"(Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese, \n"
"Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.\n",
"English"
);
#ifdef LANG_BR
ce->addValue("Brazilian");
#endif
......
......@@ -65,7 +65,11 @@ static void addTypeName()
{
//printf("addTypeName() type=`%s' scope=`%s' name=`%s'\n",
// type.data(),scope.data(),name.data());
if (name.isEmpty()) return;
if (name.isEmpty() ||
name.at(name.length()-1)==':') // end of Objective-C keyword => append to name not type
{
return;
}
if (!type.isEmpty()) type+=' ';
type+=name;
name.resize(0);
......
......@@ -266,7 +266,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]*
if (l>0)
{
int i=l-1;
while (i>=0 && (isspace(g_curArgTypeName.at(i)) || g_curArgTypeName.at(i)=='.')) i--;
while (i>=0 && (isspace((uchar)g_curArgTypeName.at(i)) || g_curArgTypeName.at(i)=='.')) i--;
while (i>=0 && isId(g_curArgTypeName.at(i))) i--;
//printf("g_curArgTypeName=`%s' i=%d\n",g_curArgTypeName.data(),i);
Argument *a = new Argument;
......
......@@ -58,7 +58,7 @@ class Definition
/*! Returns the base name of the output file that contains this
* definition.
*/
QCString qualifiedName() const;
virtual QCString qualifiedName() const;
QCString localName() const;
virtual QCString getOutputFileBase() const = 0;
/*! Returns the name of the source listing of this file. */
......
......@@ -84,6 +84,7 @@ static QStack<DocStyleChange> g_styleStack;
static QStack<DocStyleChange> g_initialStyleStack;
static QList<Definition> g_copyStack;
static QString g_fileName;
static QString g_relPath;
struct DocParserContext
{
......@@ -96,6 +97,7 @@ struct DocParserContext
QList<Definition> copyStack;
MemberDef *memberDef;
QString fileName;
QString relPath;
};
static QStack<DocParserContext> g_parserStack;
......@@ -114,6 +116,7 @@ static void docParserPushContext()
ctx->initialStyleStack = g_initialStyleStack;
ctx->copyStack = g_copyStack;
ctx->fileName = g_fileName;
ctx->relPath = g_relPath;
g_parserStack.push(ctx);
}
......@@ -128,6 +131,7 @@ static void docParserPopContext()
g_initialStyleStack = ctx->initialStyleStack;
g_copyStack = ctx->copyStack;
g_fileName = ctx->fileName;
g_relPath = ctx->relPath;
delete ctx;
doctokenizerYYpopContext();
}
......@@ -1191,7 +1195,7 @@ DocLinkedWord::DocLinkedWord(DocNode *parent,const QString &word,
const QString &ref,const QString &file,
const QString &anchor) :
m_parent(parent), m_word(word), m_ref(ref),
m_file(file), m_anchor(anchor)
m_file(file), m_relPath(g_relPath), m_anchor(anchor)
{
//printf("new word %s url=%s\n",word.data(),g_searchUrl.data());
if (!g_searchUrl.isEmpty())
......@@ -1281,7 +1285,7 @@ void DocIncOperator::parse()
if (nonEmpty) break; // we have a pattern to match
so=o+1; // no pattern, skip empty line
}
else if (!isspace(c)) // no white space char
else if (!isspace((uchar)c)) // no white space char
{
nonEmpty=TRUE;
}
......@@ -1306,7 +1310,7 @@ void DocIncOperator::parse()
if (nonEmpty) break; // we have a pattern to match
so=o+1; // no pattern, skip empty line
}
else if (!isspace(c)) // no white space char
else if (!isspace((uchar)c)) // no white space char
{
nonEmpty=TRUE;
}
......@@ -1334,7 +1338,7 @@ void DocIncOperator::parse()
if (nonEmpty) break; // we have a pattern to match
so=o+1; // no pattern, skip empty line
}
else if (!isspace(c)) // no white space char
else if (!isspace((uchar)c)) // no white space char
{
nonEmpty=TRUE;
}
......@@ -1361,7 +1365,7 @@ void DocIncOperator::parse()
if (nonEmpty) break; // we have a pattern to match
so=o+1; // no pattern, skip empty line
}
else if (!isspace(c)) // no white space char
else if (!isspace((uchar)c)) // no white space char
{
nonEmpty=TRUE;
}
......@@ -1635,7 +1639,7 @@ endsecreflist:
//---------------------------------------------------------------------------
DocInternalRef::DocInternalRef(DocNode *parent,const QString &ref)
: m_parent(parent)
: m_parent(parent), m_relPath(g_relPath)
{
int i=ref.find('#');
if (i!=-1)
......@@ -1691,6 +1695,7 @@ DocRef::DocRef(DocNode *parent,const QString &target) :
Definition *compound = 0;
QCString anchor;
ASSERT(!target.isEmpty());
m_relPath = g_relPath;
SectionInfo *sec = Doxygen::sectionDict[target];
if (sec) // ref to section or anchor
{
......@@ -1779,6 +1784,7 @@ DocLink::DocLink(DocNode *parent,const QString &target) :
//PageInfo *page;
QCString anchor;
m_refText = target;
m_relPath = g_relPath;
if (!m_refText.isEmpty() && m_refText.at(0)=='#')
{
m_refText = m_refText.right(m_refText.length()-1);
......@@ -4889,6 +4895,7 @@ DocNode *validatingParseDoc(const char *fileName,int startLine,
}
g_fileName = fileName;
g_relPath = ctx ? relativePathToRoot(ctx->getOutputFileBase()) : QString("");
g_memberDef = md;
g_nodeStack.clear();
g_styleStack.clear();
......@@ -4940,6 +4947,7 @@ DocNode *validatingParseText(const char *input)
g_token = new TokenInfo;
g_context = "";
g_fileName = "<parseText>";
g_relPath = "";
g_memberDef = 0;
g_nodeStack.clear();
g_styleStack.clear();
......
......@@ -203,6 +203,7 @@ class DocLinkedWord : public DocNode
Kind kind() const { return Kind_Word; }
DocNode *parent() const { return m_parent; }
QString file() const { return m_file; }
QString relPath() const { return m_relPath; }
QString ref() const { return m_ref; }
QString anchor() const { return m_anchor; }
void accept(DocVisitor *v) { v->visit(this); }
......@@ -212,6 +213,7 @@ class DocLinkedWord : public DocNode
QString m_word;
QString m_ref;
QString m_file;
QString m_relPath;
QString m_anchor;
};
......@@ -614,6 +616,7 @@ class DocLink : public CompAccept<DocLink>, public DocNode
QString parse(bool);
Kind kind() const { return Kind_Link; }
QString file() const { return m_file; }
QString relPath() const { return m_relPath; }
QString ref() const { return m_ref; }
QString anchor() const { return m_anchor; }
DocNode *parent() const { return m_parent; }
......@@ -622,6 +625,7 @@ class DocLink : public CompAccept<DocLink>, public DocNode
private:
DocNode *m_parent;
QString m_file;
QString m_relPath;
QString m_ref;
QString m_anchor;
QString m_refText;
......@@ -635,6 +639,7 @@ class DocRef : public CompAccept<DocRef>, public DocNode
void parse();
Kind kind() const { return Kind_Ref; }
QString file() const { return m_file; }
QString relPath() const { return m_relPath; }
QString ref() const { return m_ref; }
QString anchor() const { return m_anchor; }
QString targetTitle() const { return m_text; }
......@@ -649,6 +654,7 @@ class DocRef : public CompAccept<DocRef>, public DocNode
bool m_refToSection;
bool m_refToAnchor;
QString m_file;
QString m_relPath;
QString m_ref;
QString m_anchor;
QString m_text;
......@@ -662,6 +668,7 @@ class DocInternalRef : public CompAccept<DocInternalRef>, public DocNode
void parse();
Kind kind() const { return Kind_Ref; }
QString file() const { return m_file; }
QString relPath() const { return m_relPath; }
QString anchor() const { return m_anchor; }
DocNode *parent() const { return m_parent; }
void accept(DocVisitor *v) { CompAccept<DocInternalRef>::accept(this,v); }
......@@ -669,6 +676,7 @@ class DocInternalRef : public CompAccept<DocInternalRef>, public DocNode
private:
DocNode * m_parent;
QString m_file;
QString m_relPath;
QString m_anchor;
};
......
......@@ -292,7 +292,8 @@ TEMPCHAR [a-z_A-Z0-9,: \t\*\&]
FUNCCHAR [a-z_A-Z0-9,:\<\> \t\*\&]
SCOPESEP "::"|"#"|"."
SCOPEPRE {ID}("<"{TEMPCHAR}*">")?{SCOPESEP}
SCOPEMASK {SCOPEPRE}*(~)?{ID}("<"{TEMPCHAR}*">")?
SCOPEKEYS ":"({ID}":")*
SCOPEMASK {SCOPEPRE}*(~)?{ID}{SCOPEKEYS}?("<"{TEMPCHAR}*">")?
FUNCARG "("{FUNCCHAR}*")"
OPNEW {BLANK}+"new"({BLANK}*"[]")?
OPDEL {BLANK}+"delete"({BLANK}*"[]")?
......
......@@ -1610,6 +1610,7 @@ QCString DotClassGraph::diskName() const
QCString DotClassGraph::writeGraph(QTextStream &out,
GraphOutputFormat format,
const char *path,
const char *relPath,
bool isTBRank,
bool generateImageMap)
{
......@@ -1643,7 +1644,6 @@ QCString DotClassGraph::writeGraph(QTextStream &out,
}
baseName = convertNameToFile(diskName());
QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
QCString md5 = computeMd5Signature(m_startNode, // root
m_graphType, // gt
......@@ -1722,7 +1722,7 @@ QCString DotClassGraph::writeGraph(QTextStream &out,
if (format==BITMAP && generateImageMap) // run dot to create a image map
{
QCString mapLabel = convertNameToFile(m_startNode->m_label+"_"+mapName);
out << "<p><center><img src=\"" << baseName << "."
out << "<p><center><img src=\"" << relPath << baseName << "."
<< imgExt << "\" border=\"0\" usemap=\"#"
<< mapLabel << "\" alt=\"";
switch (m_graphType)
......@@ -1816,7 +1816,7 @@ void DotInclDepGraph::buildGraph(DotNode *n,FileDef *fd,int distance)
doc = bfd->isLinkable();
src = bfd->generateSourceFile();
}
if (doc || src)
if (doc || src || !Config_getBool("HIDE_UNDOC_RELATIONS"))
{
QCString url="";
if (bfd) url=bfd->getOutputFileBase().copy();
......@@ -1833,8 +1833,8 @@ void DotInclDepGraph::buildGraph(DotNode *n,FileDef *fd,int distance)
}
else
{
QCString tmp_url="";
if (bfd) tmp_url=bfd->getReference()+"$"+url;
QCString tmp_url;
if (bfd) tmp_url=doc || src ? bfd->getReference()+"$"+url : QCString();
bn = new DotNode(
m_curNodeNumber++,
ii->includeName,
......@@ -1890,6 +1890,7 @@ QCString DotInclDepGraph::diskName() const
QCString DotInclDepGraph::writeGraph(QTextStream &out,
GraphOutputFormat format,
const char *path,
const char *relPath,
bool generateImageMap
)
{
......@@ -1900,7 +1901,7 @@ QCString DotInclDepGraph::writeGraph(QTextStream &out,
err("Error: Output dir %s does not exist!\n",path); exit(1);
}
QCString oldDir = convertToQCString(QDir::currentDirPath());
// go to the html output directory (i.e. path)
// go to the output directory (i.e. path)
QDir::setCurrent(d.absPath());
QDir thisDir;
......@@ -1995,7 +1996,7 @@ QCString DotInclDepGraph::writeGraph(QTextStream &out,
if (format==BITMAP && generateImageMap)
{
out << "<p><center><img src=\"" << baseName << "."
out << "<p><center><img src=\"" << relPath << baseName << "."
<< imgExt << "\" border=\"0\" usemap=\"#"
<< mapName << "_map\" alt=\"";
if (m_inverse) out << "Included by dependency graph"; else out << "Include dependency graph";
......@@ -2081,7 +2082,7 @@ DotCallGraph::~DotCallGraph()
}
QCString DotCallGraph::writeGraph(QTextStream &out, GraphOutputFormat format,
const char *path,bool generateImageMap)
const char *path,const char *relPath,bool generateImageMap)
{
QDir d(path);
// store the original directory
......@@ -2177,7 +2178,7 @@ QCString DotCallGraph::writeGraph(QTextStream &out, GraphOutputFormat format,
if (format==BITMAP && generateImageMap)
{
out << "<p><center><img src=\"" << baseName << "."
out << "<p><center><img src=\"" << relPath << baseName << "."
<< imgExt << "\" border=\"0\" usemap=\"#"
<< mapName << "_map\" alt=\"";
out << "\">";
......
......@@ -137,7 +137,7 @@ class DotClassGraph
~DotClassGraph();
bool isTrivial() const;
QCString writeGraph(QTextStream &t,GraphOutputFormat f,const char *path,
bool TBRank=TRUE,bool imageMap=TRUE);
const char *relPath, bool TBRank=TRUE,bool imageMap=TRUE);
void writeXML(QTextStream &t);
void writeDEF(QTextStream &t);
......@@ -163,6 +163,7 @@ class DotInclDepGraph
DotInclDepGraph(FileDef *fd,int maxRecusionDepth,bool inverse);
~DotInclDepGraph();
QCString writeGraph(QTextStream &t, GraphOutputFormat f,const char *path,
const char *relPath,
bool writeImageMap=TRUE);
bool isTrivial() const;
QCString diskName() const;
......@@ -185,7 +186,7 @@ class DotCallGraph
DotCallGraph(MemberDef *md,int maxRecursionDepth);
~DotCallGraph();
QCString writeGraph(QTextStream &t, GraphOutputFormat f,
const char *path,bool writeImageMap=TRUE);
const char *path,const char *relPath,bool writeImageMap=TRUE);
void buildGraph(DotNode *n,MemberDef *md,int distance);
bool isTrivial() const;
......
......@@ -118,12 +118,14 @@ QTime Doxygen::runningTime;
SearchIndex * Doxygen::searchIndex=0;
SDict<DefinitionList> *Doxygen::symbolMap;
bool Doxygen::outputToWizard=FALSE;
QDict<int> * Doxygen::htmlDirMap = 0;
static StringList inputFiles;
static StringDict excludeNameDict(1009); // sections
static QDict<void> compoundKeywordDict(7); // keywords recognised as compounds
static OutputList *outputList = 0; // list of output generating objects
void clearAll()
{
inputFiles.clear();
......
......@@ -101,6 +101,7 @@ class Doxygen
static SearchIndex *searchIndex;
static SDict<DefinitionList> *symbolMap;
static bool outputToWizard;
static QDict<int> *htmlDirMap;
};
void initDoxygen();
......
......@@ -61,7 +61,7 @@ void HtmlDocVisitor::visit(DocWord *w)
void HtmlDocVisitor::visit(DocLinkedWord *w)
{
if (m_hide) return;
startLink(w->ref(),w->file(),w->anchor());
startLink(w->ref(),w->file(),w->relPath(),w->anchor());
filter(w->word());
endLink();
}
......@@ -750,7 +750,7 @@ void HtmlDocVisitor::visitPost(DocDotFile *df)
void HtmlDocVisitor::visitPre(DocLink *lnk)
{
if (m_hide) return;
startLink(lnk->ref(),lnk->file(),lnk->anchor());
startLink(lnk->ref(),lnk->file(),lnk->relPath(),lnk->anchor());
}
void HtmlDocVisitor::visitPost(DocLink *)
......@@ -762,7 +762,10 @@ void HtmlDocVisitor::visitPost(DocLink *)
void HtmlDocVisitor::visitPre(DocRef *ref)
{
if (m_hide) return;
if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor());
if (!ref->file().isEmpty())
{
startLink(ref->ref(),ref->file(),ref->relPath(),ref->anchor());
}
if (!ref->hasLinkText()) filter(ref->targetTitle());
}
......@@ -891,7 +894,7 @@ void HtmlDocVisitor::visitPost(DocXRefItem *)
void HtmlDocVisitor::visitPre(DocInternalRef *ref)
{
if (m_hide) return;
startLink(0,ref->file(),ref->anchor());
startLink(0,ref->file(),ref->relPath(),ref->anchor());
}
void HtmlDocVisitor::visitPost(DocInternalRef *)
......@@ -972,7 +975,8 @@ void HtmlDocVisitor::filterQuotedCdataAttr(const char* str)
}
}
void HtmlDocVisitor::startLink(const QString &ref,const QString &file,const QString &anchor)
void HtmlDocVisitor::startLink(const QString &ref,const QString &file,
const QString &relPath,const QString &anchor)
{
QCString *dest;
if (!ref.isEmpty()) // link to entity imported via tag file
......@@ -989,7 +993,11 @@ void HtmlDocVisitor::startLink(const QString &ref,const QString &file,const QStr
m_t << "href=\"";
if (!ref.isEmpty())
{
if ((dest=Doxygen::tagDestinationDict[ref])) m_t << *dest << "/";
if ((dest=Doxygen::tagDestinationDict[ref])) m_t << relPath << *dest << "/";
}
else
{
m_t << relPath;
}
if (!file.isEmpty()) m_t << file << Doxygen::htmlFileExtension;
if (!anchor.isEmpty()) m_t << "#" << anchor;
......
......@@ -135,7 +135,7 @@ class HtmlDocVisitor : public DocVisitor
void filter(const char *str);
void filterQuotedCdataAttr(const char* str);
void startLink(const QString &ref,const QString &file,
const QString &anchor);
const QString &relPath,const QString &anchor);
void endLink();
void writeDotFile(const QString &fileName);
......
......@@ -298,6 +298,7 @@ void HtmlGenerator::init()
g_footer=fileToString(Config_getString("HTML_FOOTER"));
//printf("g_footer='%s'\n",g_footer.data());
}
createSubDirs(d);
}
void HtmlGenerator::writeStyleSheetFile(QFile &file)
......@@ -306,7 +307,8 @@ void HtmlGenerator::writeStyleSheetFile(QFile &file)
t << defaultStyleSheet;
}
static void writeDefaultHeaderFile(QTextStream &t, const char *title)
static void writeDefaultHeaderFile(QTextStream &t, const char *title,
const char *relPath)
{
t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"
"<html><head>"
......@@ -319,7 +321,7 @@ static void writeDefaultHeaderFile(QTextStream &t, const char *title)
t << "href=\"";
if (Config_getString("HTML_STYLESHEET").isEmpty())
{
t << "doxygen.css";
t << relPath << "doxygen.css";
}
else
{
......@@ -342,7 +344,7 @@ void HtmlGenerator::writeHeaderFile(QFile &file)
#if QT_VERSION >= 200
t.setEncoding(QTextStream::Latin1);
#endif
writeDefaultHeaderFile(t,"$title");
writeDefaultHeaderFile(t,"$title",relativePathToRoot(0));
}
void HtmlGenerator::writeFooterFile(QFile &file)
......@@ -366,6 +368,8 @@ void HtmlGenerator::startFile(const char *name,const char *,
//printf("HtmlGenerator::startFile(%s)\n",name);
QCString fileName=name;
lastTitle=title;
relPath = relativePathToRoot(fileName);
if (fileName.right(Doxygen::htmlFileExtension.length())!=Doxygen::htmlFileExtension)
{
fileName+=Doxygen::htmlFileExtension;
......@@ -386,7 +390,7 @@ void HtmlGenerator::startFile(const char *name,const char *,
lastFile = fileName;
if (g_header.isEmpty())
{
writeDefaultHeaderFile(t,dispTitle);
writeDefaultHeaderFile(t,dispTitle,relPath);
}
else
{
......@@ -425,7 +429,8 @@ void HtmlGenerator::startFile(const char *name,const char *,
// t << "</a> &nbsp; ";
//}
static void writePageFooter(QTextStream &t,const QCString lastTitle)
static void writePageFooter(QTextStream &t,const QCString &lastTitle,
const QCString relPath)
{
if (g_footer.isEmpty())
{
......@@ -435,8 +440,8 @@ static void writePageFooter(QTextStream &t,const QCString lastTitle)
Config_getString("PROJECT_NAME")
);
t << endl << "<a href=\"http://www.doxygen.org/index.html\">";
t << endl << "<img src=\"doxygen.png\" alt=\"doxygen\" "
<< "align=\"middle\" border=0 > " << "</a>" << versionString << " ";
t << endl << "<img src=\"" << relPath << "doxygen.png\" alt=\"doxygen\" "
<< "align=\"middle\" border=0 >" << "</a> " << versionString << " ";
t << "</small></address>\n</body>\n</html>\n";
}
else
......@@ -447,7 +452,7 @@ static void writePageFooter(QTextStream &t,const QCString lastTitle)
void HtmlGenerator::writeFooter()
{
writePageFooter(t,lastTitle);
writePageFooter(t,lastTitle,relPath);
}
void HtmlGenerator::endFile()
......@@ -562,10 +567,6 @@ void HtmlGenerator::writeIndexItem(const char *ref,const char *f,
{
t << "</b>";
}
//if (Config_getBool("GENERATE_HTMLHELP") && f)
//{
// htmlHelp->addItem(name,((QCString)f)+htmlFileExtension);
//}
}
void HtmlGenerator::writeStartAnnoItem(const char *,const char *f,
......@@ -576,10 +577,6 @@ void HtmlGenerator::writeStartAnnoItem(const char *,const char *f,
t << "<a class=\"el\" href=\"" << f << Doxygen::htmlFileExtension << "\">";
docify(name);
t << "</a> ";
//if (Config_getBool("GENERATE_HTMLHELP") && f)
//{
// htmlHelp->addItem(name, ((QCString)f)+htmlFileExtension);
//}
}
void HtmlGenerator::writeObjectLink(const char *ref,const char *f,
......@@ -600,7 +597,11 @@ void HtmlGenerator::writeObjectLink(const char *ref,const char *f,
t << "href=\"";
if (ref)
{
if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
if ((dest=Doxygen::tagDestinationDict[ref])) t << relPath << *dest << "/";
}
else
{
t << relPath;
}
if (f) t << f << Doxygen::htmlFileExtension;
if (anchor) t << "#" << anchor;
......@@ -627,7 +628,11 @@ void HtmlGenerator::writeCodeLink(const char *ref,const char *f,
t << "href=\"";
if (ref)
{
if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
if ((dest=Doxygen::tagDestinationDict[ref])) t << relPath << *dest << "/";
}
else
{
t << relPath;
}
if (f) t << f << Doxygen::htmlFileExtension;
if (anchor) t << "#" << anchor;
......@@ -640,7 +645,7 @@ void HtmlGenerator::writeCodeLink(const char *ref,const char *f,
void HtmlGenerator::startTextLink(const char *f,const char *anchor)
{
t << "<a href=\"";
if (f) t << f << Doxygen::htmlFileExtension;
if (f) t << relPath << f << Doxygen::htmlFileExtension;
if (anchor) t << "#" << anchor;
t << "\">";
}
......@@ -1019,7 +1024,7 @@ void HtmlGenerator::startMemberDocName(bool align)
void HtmlGenerator::endMemberDocName()
{
DBG_HTML(t << "<!-- endMemberDocName -->" << endl;)
t << "</td>" << endl;
t << " </td>" << endl;
}
void HtmlGenerator::startParameterList(bool openBracket)
......@@ -1108,10 +1113,13 @@ void HtmlGenerator::endParameterList()
t << " </tr>" << endl;
}
void HtmlGenerator::endMemberDoc()
void HtmlGenerator::endMemberDoc(bool hasArgs)
{
DBG_HTML(t << "<!-- endMemberDoc -->" << endl;)
t << endl;
if (!hasArgs)
{
t << " </tr>" << endl;
}
t << " </table>" << endl;
t << " </td>" << endl;
t << " </tr>" << endl;
......@@ -1124,7 +1132,7 @@ void HtmlGenerator::startDotGraph()
void HtmlGenerator::endDotGraph(DotClassGraph &g)
{
g.writeGraph(t,BITMAP,Config_getString("HTML_OUTPUT"));
g.writeGraph(t,BITMAP,dir,relPath);
}
void HtmlGenerator::startInclDepGraph()
......@@ -1133,7 +1141,7 @@ void HtmlGenerator::startInclDepGraph()
void HtmlGenerator::endInclDepGraph(DotInclDepGraph &g)
{
g.writeGraph(t,BITMAP,Config_getString("HTML_OUTPUT"));
g.writeGraph(t,BITMAP,dir,relPath);
}
void HtmlGenerator::startCallGraph()
......@@ -1142,12 +1150,12 @@ void HtmlGenerator::startCallGraph()
void HtmlGenerator::endCallGraph(DotCallGraph &g)
{
g.writeGraph(t,BITMAP,Config_getString("HTML_OUTPUT"));
g.writeGraph(t,BITMAP,dir,relPath);
}
void HtmlGenerator::writeGraphicalHierarchy(DotGfxHierarchyTable &g)
{
g.writeGraph(t,Config_getString("HTML_OUTPUT"));
g.writeGraph(t,dir);
}
void HtmlGenerator::startMemberGroupHeader(bool)
......@@ -1278,7 +1286,8 @@ void HtmlGenerator::printDoc(DocNode *n)
}
static void startQuickIndexItem(QTextStream &t,const char *l,
bool hl,bool compact,bool &first)
bool hl,bool compact,bool &first,
const QCString &relPath)
{
if (!first && compact) t << " | ";
first=FALSE;
......@@ -1291,7 +1300,7 @@ static void startQuickIndexItem(QTextStream &t,const char *l,
{
t << "<a class=\"qindex\" ";
}
t << "href=\"" << l << "\">";
t << "href=\"" << relPath << l << "\">";
}
static void endQuickIndexItem(QTextStream &t)
......@@ -1304,7 +1313,8 @@ static QCString fixSpaces(const QCString &s)
return substitute(s," ","&nbsp;");
}
static void writeDefaultQuickLinks(QTextStream &t,bool compact,HighlightedItem hli)
static void writeDefaultQuickLinks(QTextStream &t,bool compact,
HighlightedItem hli,const QCString &relPath)
{
bool first=TRUE;
if (compact)
......@@ -1318,18 +1328,19 @@ static void writeDefaultQuickLinks(QTextStream &t,bool compact,HighlightedItem h
if (Config_getBool("SEARCHENGINE"))
{
t << " <form class=\"search\" action=\"search.php\" method=\"get\">\n";
t << " <form class=\"search\" action=\"" << relPath
<< "search.php\" method=\"get\">\n";
}
if (Config_getBool("GENERATE_TREEVIEW"))
{
startQuickIndexItem(t,"main"+Doxygen::htmlFileExtension,
hli==HLI_Main,compact,first);
hli==HLI_Main,compact,first,relPath);
}
else
{
startQuickIndexItem(t,"index"+Doxygen::htmlFileExtension,
hli==HLI_Main,compact,first);
hli==HLI_Main,compact,first,relPath);
}
t << fixSpaces(theTranslator->trMainPage());
endQuickIndexItem(t);
......@@ -1337,14 +1348,14 @@ static void writeDefaultQuickLinks(QTextStream &t,bool compact,HighlightedItem h
if (documentedGroups>0)
{
startQuickIndexItem(t,"modules"+Doxygen::htmlFileExtension,
hli==HLI_Modules,compact,first);
hli==HLI_Modules,compact,first,relPath);
t << fixSpaces(theTranslator->trModules());
endQuickIndexItem(t);
}
if (documentedNamespaces>0)
{
startQuickIndexItem(t,"namespaces"+Doxygen::htmlFileExtension,
hli==HLI_Namespaces,compact,first);
hli==HLI_Namespaces,compact,first,relPath);
if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
{
t << fixSpaces(theTranslator->trPackages());
......@@ -1358,7 +1369,7 @@ static void writeDefaultQuickLinks(QTextStream &t,bool compact,HighlightedItem h
if (hierarchyClasses>0)
{
startQuickIndexItem(t,"hierarchy"+Doxygen::htmlFileExtension,
hli==HLI_Hierarchy,compact,first);
hli==HLI_Hierarchy,compact,first,relPath);
t << fixSpaces(theTranslator->trClassHierarchy());
endQuickIndexItem(t);
}
......@@ -1367,54 +1378,54 @@ static void writeDefaultQuickLinks(QTextStream &t,bool compact,HighlightedItem h
if (Config_getBool("ALPHABETICAL_INDEX"))
{
startQuickIndexItem(t,"classes"+Doxygen::htmlFileExtension,
hli==HLI_Classes,compact,first);
hli==HLI_Classes,compact,first,relPath);
t << fixSpaces(theTranslator->trAlphabeticalList());
endQuickIndexItem(t);
}
startQuickIndexItem(t,"annotated"+Doxygen::htmlFileExtension,
hli==HLI_Annotated,compact,first);
hli==HLI_Annotated,compact,first,relPath);
t << fixSpaces(theTranslator->trCompoundList());
endQuickIndexItem(t);
}
if (documentedHtmlFiles>0)
{
startQuickIndexItem(t,"files"+Doxygen::htmlFileExtension,
hli==HLI_Files,compact,first);
hli==HLI_Files,compact,first,relPath);
t << fixSpaces(theTranslator->trFileList());
endQuickIndexItem(t);
}
if (documentedNamespaceMembers[NMHL_All]>0)
{
startQuickIndexItem(t,"namespacemembers"+Doxygen::htmlFileExtension,
hli==HLI_NamespaceMembers,compact,first);
hli==HLI_NamespaceMembers,compact,first,relPath);
t << fixSpaces(theTranslator->trNamespaceMembers());
endQuickIndexItem(t);
}
if (documentedClassMembers[CMHL_All]>0)
{
startQuickIndexItem(t,"functions"+Doxygen::htmlFileExtension,
hli==HLI_Functions,compact,first);
hli==HLI_Functions,compact,first,relPath);
t << fixSpaces(theTranslator->trCompoundMembers());
endQuickIndexItem(t);
}
if (documentedFileMembers[FMHL_All]>0)
{
startQuickIndexItem(t,"globals"+Doxygen::htmlFileExtension,
hli==HLI_Globals,compact,first);
hli==HLI_Globals,compact,first,relPath);
t << fixSpaces(theTranslator->trFileMembers());
endQuickIndexItem(t);
}
if (indexedPages>0)
{
startQuickIndexItem(t,"pages"+Doxygen::htmlFileExtension,
hli==HLI_Pages,compact,first);
hli==HLI_Pages,compact,first,relPath);
t << fixSpaces(theTranslator->trRelatedPages());
endQuickIndexItem(t);
}
if (Doxygen::exampleSDict->count()>0)
{
startQuickIndexItem(t,"examples"+Doxygen::htmlFileExtension,
hli==HLI_Examples,compact,first);
hli==HLI_Examples,compact,first,relPath);
t << fixSpaces(theTranslator->trExamples());
endQuickIndexItem(t);
}
......@@ -1454,7 +1465,7 @@ static void writeDefaultQuickLinks(QTextStream &t,bool compact,HighlightedItem h
void HtmlGenerator::writeQuickLinks(bool compact,HighlightedItem hli)
{
writeDefaultQuickLinks(t,compact,hli);
writeDefaultQuickLinks(t,compact,hli,relPath);
}
void HtmlGenerator::writeSearchPage()
......@@ -1471,7 +1482,7 @@ void HtmlGenerator::writeSearchPage()
#endif
if (g_header.isEmpty())
{
writeDefaultHeaderFile(t,"Search");
writeDefaultHeaderFile(t,"Search",0);
}
else
{
......@@ -1481,7 +1492,7 @@ void HtmlGenerator::writeSearchPage()
<< versionString << " -->" << endl;
if (!Config_getBool("DISABLE_INDEX"))
{
writeDefaultQuickLinks(t,TRUE,HLI_Search);
writeDefaultQuickLinks(t,TRUE,HLI_Search,"");
}
t << "\n<?php\n\n";
......@@ -1514,7 +1525,7 @@ void HtmlGenerator::writeSearchPage()
t << search_script;
t << "\n";
t << "?>\n";
writePageFooter(t,"Search");
writePageFooter(t,"Search","");
}
}
}
......
......@@ -128,7 +128,7 @@ class HtmlGenerator : public OutputGenerator
void lineBreak() { t << "<br>" << endl; }
void writeChar(char c);
void startMemberDoc(const char *,const char *,const char *,const char *);
void endMemberDoc();
void endMemberDoc(bool);
void startDoxyAnchor(const char *fName,const char *manName,
const char *anchor,const char *name);
void endDoxyAnchor(const char *fName,const char *anchor);
......@@ -214,6 +214,7 @@ class HtmlGenerator : public OutputGenerator
private:
QCString lastTitle;
QCString lastFile;
QCString relPath;
HtmlGenerator &operator=(const HtmlGenerator &g);
HtmlGenerator(const HtmlGenerator &g);
......
......@@ -904,7 +904,7 @@ void LatexDocVisitor::visitPre(DocXRefItem *x)
m_t << "\\item[";
if (Config_getBool("PDF_HYPERLINKS"))
{
m_t << "\\hyperlink{" << x->file() << "_" << x->anchor() << "}{";
m_t << "\\hyperlink{" << stripPath(x->file()) << "_" << x->anchor() << "}{";
}
else
{
......@@ -960,7 +960,7 @@ void LatexDocVisitor::startLink(const QString &ref,const QString &file,const QSt
if (ref.isEmpty() && Config_getBool("PDF_HYPERLINKS"))
{
m_t << "\\hyperlink{";
if (!file.isEmpty()) m_t << file;
if (!file.isEmpty()) m_t << stripPath(file);
if (!file.isEmpty() && !anchor.isEmpty()) m_t << "_";
if (!anchor.isEmpty()) m_t << anchor;
m_t << "}{";
......
......@@ -51,6 +51,7 @@
// return result;
//}
static QCString escapeLabelName(const char *s)
{
QCString result;
......@@ -222,6 +223,8 @@ void LatexGenerator::init()
t << endl
<< "clean:" << endl
<< "\trm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out refman.pdf" << endl;
createSubDirs(d);
}
static void writeDefaultHeaderPart1(QTextStream &t)
......@@ -441,6 +444,7 @@ void LatexGenerator::writeStyleSheetFile(QFile &f)
void LatexGenerator::startFile(const char *name,const char *,const char *)
{
QCString fileName=name;
relPath = relativePathToRoot(fileName);
if (fileName.right(4)!=".tex" && fileName.right(4)!=".sty") fileName+=".tex";
startPlainFile(fileName);
}
......@@ -926,7 +930,7 @@ void LatexGenerator::startTextLink(const char *f,const char *anchor)
if (Config_getBool("PDF_HYPERLINKS"))
{
t << "\\hyperlink{";
if (f) t << f;
if (f) t << stripPath(f);
if (anchor) t << "_" << anchor;
t << "}{";
}
......@@ -947,7 +951,7 @@ void LatexGenerator::writeObjectLink(const char *ref, const char *f,
if (!ref && Config_getBool("PDF_HYPERLINKS"))
{
t << "\\hyperlink{";
if (f) t << f;
if (f) t << stripPath(f);
if (f && anchor) t << "_";
if (anchor) t << anchor;
t << "}{";
......@@ -986,7 +990,7 @@ void LatexGenerator::startTitleHead(const char *fileName)
{
if (Config_getBool("PDF_HYPERLINKS") && fileName)
{
t << "\\hypertarget{" << fileName << "}{" << endl;
t << "\\hypertarget{" << stripPath(fileName) << "}{" << endl;
}
if (Config_getBool("COMPACT_LATEX"))
{
......@@ -1100,7 +1104,7 @@ void LatexGenerator::startMemberDoc(const char *clname,
t << "{\\setlength{\\rightskip}{0pt plus 5cm}";
}
void LatexGenerator::endMemberDoc()
void LatexGenerator::endMemberDoc(bool)
{
t << "}";
if (Config_getBool("COMPACT_LATEX")) t << "\\hfill";
......@@ -1112,7 +1116,7 @@ void LatexGenerator::startDoxyAnchor(const char *fName,const char *,
if (Config_getBool("PDF_HYPERLINKS"))
{
t << "\\hypertarget{";
if (fName) t << fName;
if (fName) t << stripPath(fName);
if (anchor) t << "_" << anchor;
t << "}{" << endl;
}
......@@ -1136,7 +1140,7 @@ void LatexGenerator::writeAnchor(const char *fName,const char *name)
t << "\\label{" << name << "}" << endl;
if (fName && Config_getBool("PDF_HYPERLINKS"))
{
t << "\\hypertarget{" << fName << "_" << name << "}{}" << endl;
t << "\\hypertarget{" << stripPath(fName) << "_" << name << "}{}" << endl;
}
}
......@@ -1168,7 +1172,7 @@ void LatexGenerator::startSection(const char *lab,const char *,SectionInfo::Sect
{
if (Config_getBool("PDF_HYPERLINKS"))
{
t << "\\hypertarget{" << lab << "}{}";
t << "\\hypertarget{" << stripPath(lab) << "}{}";
}
t << "\\";
if (Config_getBool("COMPACT_LATEX"))
......@@ -1380,7 +1384,7 @@ void LatexGenerator::startDotGraph()
void LatexGenerator::endDotGraph(DotClassGraph &g)
{
g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"));
g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),relPath);
}
void LatexGenerator::startInclDepGraph()
......@@ -1389,7 +1393,7 @@ void LatexGenerator::startInclDepGraph()
void LatexGenerator::endInclDepGraph(DotInclDepGraph &g)
{
g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"));
g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),relPath);
}
void LatexGenerator::startCallGraph()
......@@ -1398,7 +1402,7 @@ void LatexGenerator::startCallGraph()
void LatexGenerator::endCallGraph(DotCallGraph &g)
{
g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"));
g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),relPath);
}
void LatexGenerator::startDescription()
......
......@@ -142,7 +142,7 @@ class LatexGenerator : public OutputGenerator
void endDescItem();
void lineBreak() { t << "\\par\n"; }
void startMemberDoc(const char *,const char *,const char *,const char *);
void endMemberDoc();
void endMemberDoc(bool);
void startDoxyAnchor(const char *,const char *,const char *,const char *);
void endDoxyAnchor(const char *,const char *);
void startCodeAnchor(const char *) {}
......@@ -299,6 +299,7 @@ class LatexGenerator : public OutputGenerator
bool insideTabbing;
bool firstDescItem;
bool insidePre;
QCString relPath;
};
#endif
......@@ -35,10 +35,9 @@ static QCString getExtension()
{
QCString ext = Config_getString("MAN_EXTENSION");
if( ext.length() >= 2 &&
ext.data()[0] == '.' &&
isdigit( ext.data()[1] ) )
ext.data()[0] == '.')
{
ext = ext.mid(1, 1);
ext = ext.mid(1, ext.length()-1);
}
else
{
......@@ -95,6 +94,7 @@ void ManGenerator::init()
err("Could not create output directory %s/man%s\n",manOutput.data(),ext.data());
exit(1);
}
createSubDirs(d);
}
static QCString buildFileName(const char *name)
......@@ -405,7 +405,7 @@ void ManGenerator::startDoxyAnchor(const char *,const char *manName,
linkfile.close();
}
void ManGenerator::endMemberDoc()
void ManGenerator::endMemberDoc(bool)
{
t << "\"";
}
......
......@@ -135,7 +135,7 @@ class ManGenerator : public OutputGenerator
void lineBreak() { t << "\n.br" << endl; }
void writeChar(char c);
void startMemberDoc(const char *,const char *,const char *,const char *);
void endMemberDoc();
void endMemberDoc(bool);
void startDoxyAnchor(const char *,const char *,const char *,const char *);
void endDoxyAnchor(const char *,const char *) {}
void startCodeAnchor(const char *) {}
......
......@@ -74,24 +74,33 @@ static QCString addTemplateNames(const QCString &s,const QCString &n,const QCStr
return result;
}
static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
const QCString & /*scopeName*/,MemberDef *md)
{
ArgumentList *defArgList=md->isDocsForDefinition() ?
md->argumentList() : md->declArgumentList();
//printf("writeDefArgumentList `%s' isDocsForDefinition()=%d\n",md->name().data(),md->isDocsForDefinition());
if (defArgList==0) return; // member has no function like argument list
if (defArgList==0)
{
return FALSE; // member has no function like argument list
}
if (!md->isDefine()) ol.docify(" ");
//printf("writeDefArgList(%d)\n",defArgList->count());
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
ol.endMemberDocName();
ol.startParameterList(!md->isObjCMethod());
{
// html
ol.endMemberDocName();
ol.startParameterList(!md->isObjCMethod());
}
ol.enableAll();
ol.disable(OutputGenerator::Html);
if (!md->isObjCMethod()) ol.docify("("); // start argument list
ol.endMemberDocName();
{
// other formats
if (!md->isObjCMethod()) ol.docify("("); // start argument list
ol.endMemberDocName();
}
ol.popGeneratorState();
//printf("===> name=%s isDefine=%d\n",md->name().data(),md->isDefine());
......@@ -227,6 +236,7 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
{
ol.docify(" volatile");
}
return TRUE;
}
static void writeTemplatePrefix(OutputList &ol,ArgumentList *al)
......@@ -1168,124 +1178,145 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
)
{
// if this member is in a group find the real scope name.
bool hasParameterList = FALSE;
bool hasDocs = isDetailedSectionVisible(inGroup);
//printf("MemberDef::writeDocumentation(): name=`%s' hasDocs=`%d' containerType=%d inGroup=%d\n",
// name().data(),hasDocs,container->definitionType(),inGroup);
if ( hasDocs )
if ( !hasDocs ) return;
QCString scopeName = scName;
if (container->definitionType()==TypeGroup)
{
QCString scopeName = scName;
if (container->definitionType()==TypeGroup)
{
if (getClassDef()) scopeName=getClassDef()->name();
else if (getNamespaceDef()) scopeName=getNamespaceDef()->name();
else if (getFileDef()) scopeName=getFileDef()->name();
}
QCString cname = container->name();
QCString cfname = getOutputFileBase();
if (getClassDef()) scopeName=getClassDef()->name();
else if (getNamespaceDef()) scopeName=getNamespaceDef()->name();
else if (getFileDef()) scopeName=getFileDef()->name();
}
//ol.addIndexItem(name(),cname);
//ol.addIndexItem(cname,name());
QCString cname = container->name();
QCString cfname = getOutputFileBase();
if (Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP"))
{
HtmlHelp *htmlHelp = HtmlHelp::getInstance();
htmlHelp->addIndexItem(cname,name(),cfname,anchor());
}
//ol.addIndexItem(name(),cname);
//ol.addIndexItem(cname,name());
// get member name
QCString doxyName=name().copy();
// prepend scope if there is any. TODO: make this optional for C only docs
if (scopeName) doxyName.prepend((QCString)scopeName+"::");
if (Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP"))
{
HtmlHelp *htmlHelp = HtmlHelp::getInstance();
htmlHelp->addIndexItem(cname,name(),cfname,anchor());
}
// get member name
QCString doxyName=name().copy();
// prepend scope if there is any. TODO: make this optional for C only docs
if (scopeName) doxyName.prepend((QCString)scopeName+"::");
QCString ldef = definition();
//printf("member `%s' def=`%s'\n",name().data(),ldef.data());
if (isEnumerate())
QCString ldef = definition();
//printf("member `%s' def=`%s'\n",name().data(),ldef.data());
if (isEnumerate())
{
if (name().at(0)=='@')
{
if (name().at(0)=='@')
{
ldef = "anonymous enum";
}
else
{
ldef.prepend("enum ");
}
ldef = "anonymous enum";
}
int i=0,l;
static QRegExp r("@[0-9]+");
else
{
ldef.prepend("enum ");
}
}
int i=0,l;
static QRegExp r("@[0-9]+");
if (isEnumValue()) return;
if (isEnumValue()) return;
ol.pushGeneratorState();
ol.pushGeneratorState();
bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP");
HtmlHelp *htmlHelp = 0;
if (hasHtmlHelp) htmlHelp = HtmlHelp::getInstance();
bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP");
HtmlHelp *htmlHelp = 0;
if (hasHtmlHelp) htmlHelp = HtmlHelp::getInstance();
if ((isVariable() || isTypedef()) && (i=r.match(ldef,0,&l))!=-1)
if ((isVariable() || isTypedef()) && (i=r.match(ldef,0,&l))!=-1)
{
// find enum type and insert it in the definition
MemberListIterator vmli(*ml);
MemberDef *vmd;
bool found=FALSE;
for ( ; (vmd=vmli.current()) && !found ; ++vmli)
{
// find enum type and insert it in the definition
MemberListIterator vmli(*ml);
MemberDef *vmd;
bool found=FALSE;
for ( ; (vmd=vmli.current()) && !found ; ++vmli)
if (vmd->isEnumerate() && ldef.mid(i,l)==vmd->name())
{
if (vmd->isEnumerate() && ldef.mid(i,l)==vmd->name())
{
ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
ol.startMemberDoc(cname,name(),anchor(),name());
if (hasHtmlHelp)
{
htmlHelp->addIndexItem(cname,name(),cfname,anchor());
}
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef.left(i));
//ol+=*vmd->enumDecl();
vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef());
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef.right(ldef.length()-i-l));
found=TRUE;
}
}
if (!found) // anonymous compound
{
//printf("Anonymous compound `%s'\n",cname.data());
ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
ol.startMemberDoc(cname,name(),anchor(),name());
if (hasHtmlHelp)
{
htmlHelp->addIndexItem(cname,name(),cfname,anchor());
}
// strip anonymous compound names from definition
int si=ldef.find(' '),pi,ei=i+l;
if (si==-1) si=0;
while ((pi=r.match(ldef,i+l,&l))!=-1) ei=i=pi+l;
// first si characters of ldef contain compound type name
ol.startMemberDocName(isObjCMethod());
ol.docify(ldef.left(si));
ol.docify(" { ... } ");
// last ei characters of ldef contain pointer/reference specifiers
int ni=ldef.find("::",si);
if (ni>=ei) ei=ni+2;
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef.right(ldef.length()-ei));
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef.left(i));
//ol+=*vmd->enumDecl();
vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef());
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef.right(ldef.length()-i-l));
found=TRUE;
}
}
else // not an enum value
if (!found) // anonymous compound
{
//printf("Anonymous compound `%s'\n",cname.data());
ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
ol.startMemberDoc(cname,name(),anchor(),name());
if (hasHtmlHelp)
{
htmlHelp->addIndexItem(cname,name(),cfname,anchor());
}
// strip anonymous compound names from definition
int si=ldef.find(' '),pi,ei=i+l;
if (si==-1) si=0;
while ((pi=r.match(ldef,i+l,&l))!=-1) ei=i=pi+l;
// first si characters of ldef contain compound type name
ol.startMemberDocName(isObjCMethod());
ol.docify(ldef.left(si));
ol.docify(" { ... } ");
// last ei characters of ldef contain pointer/reference specifiers
int ni=ldef.find("::",si);
if (ni>=ei) ei=ni+2;
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef.right(ldef.length()-ei));
}
}
else // not an enum value
{
ol.startDoxyAnchor(cfname,cname,anchor(),doxyName);
ol.startMemberDoc(cname,name(),anchor(),name());
if (hasHtmlHelp)
{
htmlHelp->addIndexItem(cname,name(),cfname,anchor());
}
ClassDef *cd=getClassDef();
if (!Config_getBool("HIDE_SCOPE_NAMES"))
ClassDef *cd=getClassDef();
if (!Config_getBool("HIDE_SCOPE_NAMES"))
{
bool first=TRUE;
if (m_defTmpArgLists)
// definition has explicit template parameter declarations
{
QListIterator<ArgumentList> ali(*m_defTmpArgLists);
ArgumentList *tal;
for (ali.toFirst();(tal=ali.current());++ali)
{
if (tal->count()>0)
{
if (!first) ol.docify(" ");
ol.startMemberDocPrefixItem();
writeTemplatePrefix(ol,tal);
ol.endMemberDocPrefixItem();
}
}
}
else // definition gets it template parameters from its class
// (since no definition was found)
{
bool first=TRUE;
if (m_defTmpArgLists)
// definition has explicit template parameter declarations
if (cd)
{
QListIterator<ArgumentList> ali(*m_defTmpArgLists);
QList<ArgumentList> tempParamLists;
cd->getTemplateParameterLists(tempParamLists);
//printf("#tempParamLists=%d\n",tempParamLists.count());
QListIterator<ArgumentList> ali(tempParamLists);
ArgumentList *tal;
for (ali.toFirst();(tal=ali.current());++ali)
{
......@@ -1298,499 +1329,485 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
}
}
}
else // definition gets it template parameters from its class
// (since no definition was found)
if (tArgList) // function template prefix
{
if (cd)
{
QList<ArgumentList> tempParamLists;
cd->getTemplateParameterLists(tempParamLists);
//printf("#tempParamLists=%d\n",tempParamLists.count());
QListIterator<ArgumentList> ali(tempParamLists);
ArgumentList *tal;
for (ali.toFirst();(tal=ali.current());++ali)
{
if (tal->count()>0)
{
if (!first) ol.docify(" ");
ol.startMemberDocPrefixItem();
writeTemplatePrefix(ol,tal);
ol.endMemberDocPrefixItem();
}
}
}
if (tArgList) // function template prefix
{
ol.startMemberDocPrefixItem();
writeTemplatePrefix(ol,tArgList);
ol.endMemberDocPrefixItem();
}
ol.startMemberDocPrefixItem();
writeTemplatePrefix(ol,tArgList);
ol.endMemberDocPrefixItem();
}
}
ol.startMemberDocName(isObjCMethod());
if (isObjCMethod())
}
ol.startMemberDocName(isObjCMethod());
if (cd && cd->isObjectiveC())
{
// strip scope name
int ep = ldef.find("::");
if (ep!=-1)
{
// strip scope name
int ep = ldef.find("::");
if (ep!=-1)
{
int sp=ldef.findRev(' ',ep);
if (sp!=-1)
{
ldef=ldef.left(sp+1)+ldef.mid(ep+2);
}
}
// strip keywords
int dp = ldef.find(':');
if (dp!=-1)
{
ldef=ldef.left(dp+1);
}
int l=ldef.length();
//printf("start >%s<\n",ldef.data());
int i=l-1;
while (i>=0 && (isId(ldef.at(i)) || ldef.at(i)==':')) i--;
while (i>=0 && isspace(ldef.at(i))) i--;
if (i>0)
int sp=ldef.findRev(' ',ep);
if (sp!=-1)
{
// insert braches around the type
QCString tmp("("+ldef.left(i+1)+")"+ldef.mid(i+1));
ldef=tmp;
ldef=ldef.left(sp+1)+ldef.mid(ep+2);
}
//printf("end >%s< i=%d\n",ldef.data(),i);
if (isStatic()) ldef.prepend("+ "); else ldef.prepend("- ");
}
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef);
writeDefArgumentList(ol,cd,scopeName,this);
if (hasOneLineInitializer()) // add initializer
// strip keywords
int dp = ldef.find(':');
if (dp!=-1)
{
if (!isDefine())
{
ol.docify(" = ");
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),init.simplifyWhiteSpace());
}
else
{
ol.writeNonBreakableSpace(3);
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),init);
}
ldef=ldef.left(dp+1);
}
if (excpString()) // add exception list
int l=ldef.length();
//printf("start >%s<\n",ldef.data());
int i=l-1;
while (i>=0 && (isId(ldef.at(i)) || ldef.at(i)==':')) i--;
while (i>=0 && isspace((uchar)ldef.at(i))) i--;
if (i>0)
{
ol.docify(" ");
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),excpString());
// insert braches around the type
QCString tmp("("+ldef.left(i+1)+")"+ldef.mid(i+1));
ldef=tmp;
}
//printf("end >%s< i=%d\n",ldef.data(),i);
if (isStatic()) ldef.prepend("+ "); else ldef.prepend("- ");
}
Specifier lvirt=virtualness();
if (!isObjCMethod() &&
(protection()!=Public || lvirt!=Normal ||
isFriend() || isRelated() || isExplicit() ||
isMutable() || (isInline() && Config_getBool("INLINE_INFO")) ||
isSignal() || isSlot() ||
isStatic() || (classDef && classDef!=container) ||
isSettable() || isGettable() || isReadable() || isWritable()
)
)
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef);
hasParameterList=writeDefArgumentList(ol,cd,scopeName,this);
if (hasOneLineInitializer()) // add initializer
{
// write the member specifier list
ol.writeLatexSpacing();
ol.startTypewriter();
ol.docify(" [");
QStrList sl;
if (isFriend()) sl.append("friend");
else if (isRelated()) sl.append("related");
else
if (!isDefine())
{
if (Config_getBool("INLINE_INFO") && isInline())
sl.append("inline");
if (isExplicit()) sl.append("explicit");
if (isMutable()) sl.append("mutable");
if (isStatic()) sl.append("static");
if (isGettable()) sl.append("get");
if (isSettable()) sl.append("set");
if (isReadable()) sl.append("read");
if (isWritable()) sl.append("write");
if (protection()==Protected) sl.append("protected");
else if (protection()==Private) sl.append("private");
else if (protection()==Package) sl.append("package");
if (lvirt==Virtual) sl.append("virtual");
else if (lvirt==Pure) sl.append("pure virtual");
if (isSignal()) sl.append("signal");
if (isSlot()) sl.append("slot");
ol.docify(" = ");
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),init.simplifyWhiteSpace());
}
if (classDef && classDef!=container) sl.append("inherited");
const char *s=sl.first();
while (s)
else
{
ol.docify(s);
s=sl.next();
if (s) ol.docify(", ");
ol.writeNonBreakableSpace(3);
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),init);
}
ol.docify("]");
ol.endTypewriter();
}
else if (isObjCMethod() && isImplementation())
if (excpString()) // add exception list
{
ol.writeLatexSpacing();
ol.startTypewriter();
ol.docify(" [implementation]");
ol.endTypewriter();
ol.docify(" ");
linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),excpString());
}
if (!isDefine() && defArgList) ol.endParameterList();
ol.endMemberDoc();
ol.endDoxyAnchor(cfname,anchor());
ol.startIndent();
ol.pushGeneratorState();
ol.disable(OutputGenerator::RTF);
ol.newParagraph();
ol.popGeneratorState();
}
/* write multi-line initializer (if any) */
if (hasMultiLineInitializer()
//initLines>0 && ((initLines<maxInitLines && userInitLines==-1) // implicitly enabled
// || initLines<userInitLines // explicitly enabled
// )
)
Specifier lvirt=virtualness();
if (!isObjCMethod() &&
(protection()!=Public || lvirt!=Normal ||
isFriend() || isRelated() || isExplicit() ||
isMutable() || (isInline() && Config_getBool("INLINE_INFO")) ||
isSignal() || isSlot() ||
isStatic() || (classDef && classDef!=container) ||
isSettable() || isGettable() || isReadable() || isWritable()
)
)
{
// write the member specifier list
ol.writeLatexSpacing();
ol.startTypewriter();
ol.docify(" [");
QStrList sl;
if (isFriend()) sl.append("friend");
else if (isRelated()) sl.append("related");
else
{
//printf("md=%s initLines=%d init=`%s'\n",name().data(),initLines,init.data());
ol.startBold();
if (mtype==Define)
ol.parseText(theTranslator->trDefineValue());
else
ol.parseText(theTranslator->trInitialValue());
ol.endBold();
initParseCodeContext();
ol.startCodeFragment();
parseCode(ol,scopeName,init,FALSE,0);
ol.endCodeFragment();
if (Config_getBool("INLINE_INFO") && isInline())
sl.append("inline");
if (isExplicit()) sl.append("explicit");
if (isMutable()) sl.append("mutable");
if (isStatic()) sl.append("static");
if (isGettable()) sl.append("get");
if (isSettable()) sl.append("set");
if (isReadable()) sl.append("read");
if (isWritable()) sl.append("write");
if (protection()==Protected) sl.append("protected");
else if (protection()==Private) sl.append("private");
else if (protection()==Package) sl.append("package");
if (lvirt==Virtual) sl.append("virtual");
else if (lvirt==Pure) sl.append("pure virtual");
if (isSignal()) sl.append("signal");
if (isSlot()) sl.append("slot");
}
QCString brief = m_templateMaster ?
m_templateMaster->briefDescription() : briefDescription();
QCString detailed = m_templateMaster ?
m_templateMaster->documentation() : documentation();
ArgumentList *docArgList = m_templateMaster ?
m_templateMaster->defArgList : defArgList;
/* write brief description */
if (!brief.isEmpty() &&
(Config_getBool("REPEAT_BRIEF") ||
!Config_getBool("BRIEF_MEMBER_DESC")
)
)
{
ol.parseDoc(briefFile(),briefLine(),getOuterScope()?getOuterScope():container,this,brief,FALSE,FALSE);
ol.newParagraph();
if (classDef && classDef!=container) sl.append("inherited");
const char *s=sl.first();
while (s)
{
ol.docify(s);
s=sl.next();
if (s) ol.docify(", ");
}
ol.docify("]");
ol.endTypewriter();
}
else if (isObjCMethod() && isImplementation())
{
ol.writeLatexSpacing();
ol.startTypewriter();
ol.docify(" [implementation]");
ol.endTypewriter();
}
if (hasParameterList)
{
ol.endParameterList();
ol.endMemberDoc(TRUE);
}
else
{
ol.endMemberDocName();
ol.endMemberDoc(FALSE);
}
ol.endDoxyAnchor(cfname,anchor());
ol.startIndent();
/* write detailed description */
if (!detailed.isEmpty())
{
ol.parseDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,detailed+"\n",TRUE,FALSE);
ol.pushGeneratorState();
if (!m_inbodyDocs.isEmpty())
{
ol.newParagraph();
ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,m_inbodyDocs+"\n",TRUE,FALSE);
}
ol.disableAllBut(OutputGenerator::RTF);
ol.pushGeneratorState();
ol.disable(OutputGenerator::RTF);
ol.newParagraph();
ol.popGeneratorState();
/* write multi-line initializer (if any) */
if (hasMultiLineInitializer()
//initLines>0 && ((initLines<maxInitLines && userInitLines==-1) // implicitly enabled
// || initLines<userInitLines // explicitly enabled
// )
)
{
//printf("md=%s initLines=%d init=`%s'\n",name().data(),initLines,init.data());
ol.startBold();
if (mtype==Define)
ol.parseText(theTranslator->trDefineValue());
else
ol.parseText(theTranslator->trInitialValue());
ol.endBold();
initParseCodeContext();
ol.startCodeFragment();
parseCode(ol,scopeName,init,FALSE,0);
ol.endCodeFragment();
}
QCString brief = m_templateMaster ?
m_templateMaster->briefDescription() : briefDescription();
QCString detailed = m_templateMaster ?
m_templateMaster->documentation() : documentation();
ArgumentList *docArgList = m_templateMaster ?
m_templateMaster->defArgList : defArgList;
/* write brief description */
if (!brief.isEmpty() &&
(Config_getBool("REPEAT_BRIEF") ||
!Config_getBool("BRIEF_MEMBER_DESC")
)
)
{
ol.parseDoc(briefFile(),briefLine(),getOuterScope()?getOuterScope():container,this,brief,FALSE,FALSE);
ol.newParagraph();
}
/* write detailed description */
if (!detailed.isEmpty())
{
ol.parseDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,detailed+"\n",TRUE,FALSE);
ol.pushGeneratorState();
if (!m_inbodyDocs.isEmpty())
{
ol.newParagraph();
ol.popGeneratorState();
ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,m_inbodyDocs+"\n",TRUE,FALSE);
}
else if(!brief.isEmpty() && (Config_getBool("REPEAT_BRIEF") ||
!Config_getBool("BRIEF_MEMBER_DESC")))
ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph();
ol.popGeneratorState();
}
else if(!brief.isEmpty() && (Config_getBool("REPEAT_BRIEF") ||
!Config_getBool("BRIEF_MEMBER_DESC")))
{
if (!m_inbodyDocs.isEmpty())
{
if (!m_inbodyDocs.isEmpty())
{
ol.newParagraph();
ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,m_inbodyDocs+"\n",TRUE,FALSE);
}
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph();
ol.popGeneratorState();
ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,m_inbodyDocs+"\n",TRUE,FALSE);
}
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph();
ol.popGeneratorState();
}
//printf("***** defArgList=%p name=%s docs=%s hasDocs=%d\n",
// defArgList,
// defArgList?defArgList->hasDocumentation():-1);
if (docArgList && docArgList->hasDocumentation())
//printf("***** defArgList=%p name=%s docs=%s hasDocs=%d\n",
// defArgList,
// defArgList?defArgList->hasDocumentation():-1);
if (docArgList && docArgList->hasDocumentation())
{
//printf("***** argumentList is documented\n");
ol.startParamList(BaseOutputDocInterface::Param,theTranslator->trParameters()+": ");
ol.writeDescItem();
ol.startDescTable();
ArgumentListIterator ali(*docArgList);
Argument *a;
for (ali.toFirst();(a=ali.current());++ali)
{
//printf("***** argumentList is documented\n");
ol.startParamList(BaseOutputDocInterface::Param,theTranslator->trParameters()+": ");
ol.writeDescItem();
ol.startDescTable();
ArgumentListIterator ali(*docArgList);
Argument *a;
for (ali.toFirst();(a=ali.current());++ali)
if (a->hasDocumentation())
{
if (a->hasDocumentation())
{
ol.startDescTableTitle();
ol.docify(a->name);
ol.endDescTableTitle();
ol.startDescTableData();
ol.parseDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,a->docs+"\n",TRUE,FALSE);
ol.endDescTableData();
}
ol.startDescTableTitle();
ol.docify(a->name);
ol.endDescTableTitle();
ol.startDescTableData();
ol.parseDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,a->docs+"\n",TRUE,FALSE);
ol.endDescTableData();
}
ol.endDescTable();
ol.endParamList();
}
if (isEnumerate())
ol.endDescTable();
ol.endParamList();
}
if (isEnumerate())
{
bool first=TRUE;
MemberList *fmdl=enumFieldList();
if (fmdl)
{
bool first=TRUE;
MemberList *fmdl=enumFieldList();
if (fmdl)
MemberDef *fmd=fmdl->first();
while (fmd)
{
MemberDef *fmd=fmdl->first();
while (fmd)
if (fmd->isLinkable())
{
if (fmd->isLinkable())
if (first)
{
if (first)
{
//ol.newParagraph();
ol.startSimpleSect(BaseOutputDocInterface::EnumValues,0,0,theTranslator->trEnumerationValues()+": ");
ol.writeDescItem();
ol.startDescTable();
}
ol.addIndexItem(fmd->name(),cname);
ol.addIndexItem(cname,fmd->name());
if (Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP"))
{
HtmlHelp::getInstance()->addIndexItem(cname,fmd->name(),cfname,fmd->anchor());
}
//ol.writeListItem();
ol.startDescTableTitle(); // this enables emphasis!
ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name());
first=FALSE;
//ol.startEmphasis();
ol.docify(fmd->name());
//ol.endEmphasis();
ol.disableAllBut(OutputGenerator::Man);
ol.writeString(" ");
ol.enableAll();
ol.endDoxyAnchor(cfname,fmd->anchor());
ol.endDescTableTitle();
//ol.newParagraph();
ol.startDescTableData();
if (!fmd->briefDescription().isEmpty())
{
ol.parseDoc(fmd->briefFile(),fmd->briefLine(),getOuterScope()?getOuterScope():container,fmd,fmd->briefDescription(),TRUE,FALSE);
//ol.newParagraph();
}
if (!fmd->briefDescription().isEmpty() &&
!fmd->documentation().isEmpty())
{
ol.newParagraph();
}
if (!fmd->documentation().isEmpty())
{
ol.parseDoc(fmd->docFile(),fmd->docLine(),getOuterScope()?getOuterScope():container,fmd,fmd->documentation()+"\n",TRUE,FALSE);
}
ol.endDescTableData();
ol.startSimpleSect(BaseOutputDocInterface::EnumValues,0,0,theTranslator->trEnumerationValues()+": ");
ol.writeDescItem();
ol.startDescTable();
}
fmd=fmdl->next();
}
}
if (!first)
{
//ol.endItemList();
ol.endDescTable();
ol.endSimpleSect();
ol.writeChar('\n');
}
}
MemberDef *bmd=reimplements();
ClassDef *bcd=0;
if (bmd && (bcd=bmd->getClassDef()))
{
// write class that contains a member that is reimplemented by this one
if (bcd->isLinkable())
{
ol.disable(OutputGenerator::RTF);
ol.newParagraph();
ol.enableAll();
ol.addIndexItem(fmd->name(),cname);
ol.addIndexItem(cname,fmd->name());
QCString reimplFromLine;
if (bmd->virtualness()!=Pure && bcd->compoundType()!=ClassDef::Interface)
{
reimplFromLine = theTranslator->trReimplementedFromList(1);
}
else
{
reimplFromLine = theTranslator->trImplementedFromList(1);
}
int markerPos = reimplFromLine.find("@0");
if (markerPos!=-1) // should always pass this.
{
ol.parseText(reimplFromLine.left(markerPos)); //text left from marker
if (bmd->isLinkable()) // replace marker with link
if (Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP"))
{
//Definition *bd=bmd->group;
//if (bd==0) bd=bcd;
ol.writeObjectLink(bmd->getReference(),bmd->getOutputFileBase(),
bmd->anchor(),bcd->displayName());
//ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
// bmd->anchor(),bcd->name());
if ( bmd->isLinkableInProject() )
{
writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor());
}
HtmlHelp::getInstance()->addIndexItem(cname,fmd->name(),cfname,fmd->anchor());
}
else
//ol.writeListItem();
ol.startDescTableTitle(); // this enables emphasis!
ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name());
first=FALSE;
//ol.startEmphasis();
ol.docify(fmd->name());
//ol.endEmphasis();
ol.disableAllBut(OutputGenerator::Man);
ol.writeString(" ");
ol.enableAll();
ol.endDoxyAnchor(cfname,fmd->anchor());
ol.endDescTableTitle();
//ol.newParagraph();
ol.startDescTableData();
if (!fmd->briefDescription().isEmpty())
{
ol.parseDoc(fmd->briefFile(),fmd->briefLine(),getOuterScope()?getOuterScope():container,fmd,fmd->briefDescription(),TRUE,FALSE);
//ol.newParagraph();
}
if (!fmd->briefDescription().isEmpty() &&
!fmd->documentation().isEmpty())
{
ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
0,bcd->displayName());
if (bcd->isLinkableInProject()/* && !Config_getBool("PDF_HYPERLINKS")*/ )
{
writePageRef(ol,bcd->getOutputFileBase(),0);
}
ol.newParagraph();
}
ol.parseText(reimplFromLine.right(
reimplFromLine.length()-markerPos-2)); // text right from marker
ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph();
ol.enableAll();
}
else
{
err("Error: translation error: no marker in trReimplementsFromList()\n");
if (!fmd->documentation().isEmpty())
{
ol.parseDoc(fmd->docFile(),fmd->docLine(),getOuterScope()?getOuterScope():container,fmd,fmd->documentation()+"\n",TRUE,FALSE);
}
ol.endDescTableData();
}
fmd=fmdl->next();
}
//ol.writeString(".");
}
if (!first)
{
//ol.endItemList();
ol.endDescTable();
ol.endSimpleSect();
ol.writeChar('\n');
}
}
MemberList *bml=reimplementedBy();
if (bml)
MemberDef *bmd=reimplements();
ClassDef *bcd=0;
if (bmd && (bcd=bmd->getClassDef()))
{
// write class that contains a member that is reimplemented by this one
if (bcd->isLinkable())
{
MemberListIterator mli(*bml);
MemberDef *bmd=0;
uint count=0;
ClassDef *bcd=0;
for (mli.toFirst();(bmd=mli.current()) && (bcd=bmd->getClassDef());++mli)
ol.disable(OutputGenerator::RTF);
ol.newParagraph();
ol.enableAll();
QCString reimplFromLine;
if (bmd->virtualness()!=Pure && bcd->compoundType()!=ClassDef::Interface)
{
// count the members that directly inherit from md and for
// which the member and class are visible in the docs.
if ( bmd->isLinkable() && bcd->isLinkable() )
{
count++;
}
reimplFromLine = theTranslator->trReimplementedFromList(1);
}
if (count>0)
else
{
mli.toFirst();
// write the list of classes that overwrite this member
ol.disable(OutputGenerator::RTF);
ol.newParagraph();
ol.enableAll();
QCString reimplInLine;
if (virt==Pure || (classDef && classDef->compoundType()==ClassDef::Interface))
reimplFromLine = theTranslator->trImplementedFromList(1);
}
int markerPos = reimplFromLine.find("@0");
if (markerPos!=-1) // should always pass this.
{
ol.parseText(reimplFromLine.left(markerPos)); //text left from marker
if (bmd->isLinkable()) // replace marker with link
{
reimplInLine = theTranslator->trImplementedInList(count);
//Definition *bd=bmd->group;
//if (bd==0) bd=bcd;
ol.writeObjectLink(bmd->getReference(),bmd->getOutputFileBase(),
bmd->anchor(),bcd->displayName());
//ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
// bmd->anchor(),bcd->name());
if ( bmd->isLinkableInProject() )
{
writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor());
}
}
else
{
reimplInLine = theTranslator->trReimplementedInList(count);
}
static QRegExp marker("@[0-9]+");
int index=0,newIndex,matchLen;
// now replace all markers in reimplInLine with links to the classes
while ((newIndex=marker.match(reimplInLine,index,&matchLen))!=-1)
{
ol.parseText(reimplInLine.mid(index,newIndex-index));
bool ok;
uint entryIndex = reimplInLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
//bmd=bml->at(entryIndex);
count=0;
// find the entryIndex-th documented entry in the inheritance list.
for (mli.toLast();(bmd=mli.current()) && (bcd=bmd->getClassDef());--mli)
ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
0,bcd->displayName());
if (bcd->isLinkableInProject()/* && !Config_getBool("PDF_HYPERLINKS")*/ )
{
if ( bmd->isLinkable() && bcd->isLinkable())
{
if (count==entryIndex) break;
count++;
}
writePageRef(ol,bcd->getOutputFileBase(),0);
}
}
ol.parseText(reimplFromLine.right(
reimplFromLine.length()-markerPos-2)); // text right from marker
if (ok && bcd && bmd) // write link for marker
{
//ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
// bmd->anchor(),bcd->name());
ol.writeObjectLink(bmd->getReference(),bmd->getOutputFileBase(),
bmd->anchor(),bcd->displayName());
if (bmd->isLinkableInProject() )
{
writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor());
}
}
++mli;
index=newIndex+matchLen;
}
ol.parseText(reimplInLine.right(reimplInLine.length()-index));
ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph();
ol.enableAll();
}
else
{
err("Error: translation error: no marker in trReimplementsFromList()\n");
}
}
// write the list of examples that use this member
if (hasExamples())
//ol.writeString(".");
}
MemberList *bml=reimplementedBy();
if (bml)
{
MemberListIterator mli(*bml);
MemberDef *bmd=0;
uint count=0;
ClassDef *bcd=0;
for (mli.toFirst();(bmd=mli.current()) && (bcd=bmd->getClassDef());++mli)
{
ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": ");
ol.writeDescItem();
writeExample(ol,getExamples());
//ol.endDescItem();
ol.endSimpleSect();
// count the members that directly inherit from md and for
// which the member and class are visible in the docs.
if ( bmd->isLinkable() && bcd->isLinkable() )
{
count++;
}
}
// write reference to the source
writeSourceDef(ol,cname);
writeSourceRefs(ol,cname);
writeSourceReffedBy(ol,cname);
writeInlineCode(ol,cname);
if (count>0)
{
mli.toFirst();
// write the list of classes that overwrite this member
ol.disable(OutputGenerator::RTF);
ol.newParagraph();
ol.enableAll();
ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph();
ol.enableAll();
QCString reimplInLine;
if (virt==Pure || (classDef && classDef->compoundType()==ClassDef::Interface))
{
reimplInLine = theTranslator->trImplementedInList(count);
}
else
{
reimplInLine = theTranslator->trReimplementedInList(count);
}
static QRegExp marker("@[0-9]+");
int index=0,newIndex,matchLen;
// now replace all markers in reimplInLine with links to the classes
while ((newIndex=marker.match(reimplInLine,index,&matchLen))!=-1)
{
ol.parseText(reimplInLine.mid(index,newIndex-index));
bool ok;
uint entryIndex = reimplInLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
//bmd=bml->at(entryIndex);
count=0;
// find the entryIndex-th documented entry in the inheritance list.
for (mli.toLast();(bmd=mli.current()) && (bcd=bmd->getClassDef());--mli)
{
if ( bmd->isLinkable() && bcd->isLinkable())
{
if (count==entryIndex) break;
count++;
}
}
ol.endIndent();
// enable LaTeX again
//if (Config_getBool("EXTRACT_ALL") && !hasDocs) ol.enable(OutputGenerator::Latex);
ol.popGeneratorState();
if (ok && bcd && bmd) // write link for marker
{
//ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
// bmd->anchor(),bcd->name());
ol.writeObjectLink(bmd->getReference(),bmd->getOutputFileBase(),
bmd->anchor(),bcd->displayName());
if (bmd->isLinkableInProject() )
{
writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor());
}
}
++mli;
index=newIndex+matchLen;
}
ol.parseText(reimplInLine.right(reimplInLine.length()-index));
ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph();
ol.enableAll();
}
}
// write the list of examples that use this member
if (hasExamples())
{
ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": ");
ol.writeDescItem();
writeExample(ol,getExamples());
//ol.endDescItem();
ol.endSimpleSect();
}
// write reference to the source
writeSourceDef(ol,cname);
writeSourceRefs(ol,cname);
writeSourceReffedBy(ol,cname);
writeInlineCode(ol,cname);
if ((m_hasCallGraph || Config_getBool("CALL_GRAPH"))
&& isFunction() && Config_getBool("HAVE_DOT")
)
ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph();
ol.enableAll();
if ((m_hasCallGraph || Config_getBool("CALL_GRAPH"))
&& isFunction() && Config_getBool("HAVE_DOT")
)
{
DotCallGraph callGraph(this,Config_getInt("MAX_DOT_GRAPH_DEPTH"));
if (!callGraph.isTrivial())
{
DotCallGraph callGraph(this,Config_getInt("MAX_DOT_GRAPH_DEPTH"));
if (!callGraph.isTrivial())
{
msg("Generating call graph for function %s\n",qualifiedName().data());
ol.disable(OutputGenerator::Man);
ol.newParagraph();
ol.startCallGraph();
ol.parseText(theTranslator->trCallGraph());
ol.endCallGraph(callGraph);
ol.enableAll();
}
msg("Generating call graph for function %s\n",qualifiedName().data());
ol.disable(OutputGenerator::Man);
ol.newParagraph();
ol.startCallGraph();
ol.parseText(theTranslator->trCallGraph());
ol.endCallGraph(callGraph);
ol.enableAll();
}
}
ol.endIndent();
// enable LaTeX again
//if (Config_getBool("EXTRACT_ALL") && !hasDocs) ol.enable(OutputGenerator::Latex);
ol.popGeneratorState();
}
void MemberDef::warnIfUndocumented()
......@@ -1969,7 +1986,7 @@ void MemberDef::setInitializer(const char *initializer)
{
init=initializer;
int p=init.length()-1;
while (p>=0 && isspace(init.at(p))) p--;
while (p>=0 && isspace((uchar)init.at(p))) p--;
init=init.left(p+1);
initLines=init.contains('\n');
}
......@@ -2209,4 +2226,21 @@ bool MemberDef::isObjCMethod() const
return FALSE;
}
QCString MemberDef::qualifiedName() const
{
if (isObjCMethod())
{
QCString qm;
if (isStatic()) qm="+"; else qm="-";
qm+="[";
qm+=classDef->name()+" ";
qm+=name();
qm+="]";
return qm;
}
else
{
return Definition::qualifiedName();
}
}
......@@ -99,6 +99,7 @@ class MemberDef : public Definition
const char *getGroupFileName() const { return groupFileName; }
int getGroupStartLine() const { return groupStartLine; }
bool getGroupHasDocs() const { return groupHasDocs; }
QCString qualifiedName() const;
// direct kind info
Protection protection() const { return prot; }
......
......@@ -316,7 +316,7 @@ class OutputGenerator : public BaseOutputDocInterface
virtual void insertMemberAlign() = 0;
virtual void startMemberDoc(const char *,const char *,
const char *,const char *) = 0;
virtual void endMemberDoc() = 0;
virtual void endMemberDoc(bool) = 0;
virtual void startDoxyAnchor(const char *fName,const char *manName,
const char *anchor,const char *name) = 0;
virtual void endDoxyAnchor(const char *fileName,const char *anchor) = 0;
......
......@@ -207,8 +207,8 @@ class OutputList : public OutputDocInterface
void startMemberDoc(const char *clName,const char *memName,
const char *anchor,const char *title)
{ forall(&OutputGenerator::startMemberDoc,clName,memName,anchor,title); }
void endMemberDoc()
{ forall(&OutputGenerator::endMemberDoc); }
void endMemberDoc(bool hasArgs)
{ forall(&OutputGenerator::endMemberDoc,hasArgs); }
void startDoxyAnchor(const char *fName,const char *manName,
const char *anchor, const char *name)
{ forall(&OutputGenerator::startDoxyAnchor,fName,manName,anchor,name); }
......
......@@ -190,6 +190,8 @@ void RTFGenerator::init()
{
loadExtensions(rtfExtensionsFile);
}
createSubDirs(d);
}
static QCString makeIndexName(const char *s,int i)
......@@ -322,6 +324,7 @@ void RTFGenerator::beginRTFSection()
void RTFGenerator::startFile(const char *name,const char *,const char *)
{
QCString fileName=name;
relPath = relativePathToRoot(fileName);
if (fileName.right(4)!=".rtf" ) fileName+=".rtf";
startPlainFile(fileName);
......@@ -1357,7 +1360,7 @@ void RTFGenerator::startMemberDoc(const char *clname,
t << endl;
}
void RTFGenerator::endMemberDoc()
void RTFGenerator::endMemberDoc(bool)
{
DBG_RTF(t << "{\\comment endMemberDoc}" << endl)
t << "}" << endl;
......@@ -2188,7 +2191,7 @@ void RTFGenerator::endDotGraph(DotClassGraph &g)
newParagraph();
QCString fileName =
g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),TRUE,FALSE);
g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),relPath,TRUE,FALSE);
// display the file
t << "{" << endl;
......@@ -2210,7 +2213,8 @@ void RTFGenerator::endInclDepGraph(DotInclDepGraph &g)
{
newParagraph();
QCString fileName = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),FALSE);
QCString fileName = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
relPath,FALSE);
// display the file
t << "{" << endl;
......@@ -2231,7 +2235,8 @@ void RTFGenerator::endCallGraph(DotCallGraph &g)
{
newParagraph();
QCString fileName = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),FALSE);
QCString fileName = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
relPath,FALSE);
// display the file
t << "{" << endl;
......
......@@ -134,7 +134,7 @@ class RTFGenerator : public OutputGenerator
void endDescItem();
void lineBreak();
void startMemberDoc(const char *,const char *,const char *,const char *);
void endMemberDoc();
void endMemberDoc(bool);
void startDoxyAnchor(const char *,const char *,const char *,const char *);
void endDoxyAnchor(const char *,const char *);
void startCodeAnchor(const char *) {};
......@@ -282,6 +282,7 @@ class RTFGenerator : public OutputGenerator
int m_listLevel; // // RTF does not really have a addative indent...manually set list level.
bool m_omitParagraph; // should a the next paragraph command be ignored?
int m_numCols; // number of columns in a table
QCString relPath;
void beginRTFDocument();
void beginRTFChapter();
......
......@@ -516,7 +516,7 @@ static void splitKnRArg(QCString &oldStyleArgPtr,QCString &oldStyleArgName)
int s=bi2+1;
oldStyleArgType = current->args.left(s);
int i=s;
while (i<si && ((c=current->args.at(i))=='*' || isspace(c))) i++;
while (i<si && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i++;
oldStyleArgType += current->args.mid(s,i-s);
s=i;
while (i<si && isId(current->args.at(i))) i++;
......@@ -529,7 +529,7 @@ static void splitKnRArg(QCString &oldStyleArgPtr,QCString &oldStyleArgName)
oldStyleArgType = current->args.left(s);
s++;
int i=s+1;
while (i<si && ((c=current->args.at(i))=='*' || isspace(c))) i++;
while (i<si && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i++;
oldStyleArgType += current->args.mid(s,i-s);
s=i;
while (i<si && isId(current->args.at(i))) i++;
......@@ -543,7 +543,7 @@ static void splitKnRArg(QCString &oldStyleArgPtr,QCString &oldStyleArgName)
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--;
while (i>=0 && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i--;
i++;
if (i!=l)
{
......@@ -561,7 +561,7 @@ static void splitKnRArg(QCString &oldStyleArgPtr,QCString &oldStyleArgName)
{
int l=si,j=0;
char c;
while (j<l && ((c=current->args.at(j))=='*' || isspace(c))) j++;
while (j<l && ((c=current->args.at(j))=='*' || isspace((uchar)c))) j++;
if (j>0)
{
oldStyleArgPtr=current->args.left(j);
......@@ -750,7 +750,6 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
%x PageDocArg2
%x FileDocArg1
%x FileDocArg2
%x ExampleDoc
%x ExampleDocArg1
%x EnumDocArg1
%x FuncPtr
......@@ -1067,9 +1066,17 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
<ObjCReturnType>")" {
BEGIN( ObjCMethod );
}
<ObjCParams>{ID}/":" { // Keyword of parameter
current->argList->getLast()->attrib=(QCString)"["+yytext+"]";
current->name += yytext;
<ObjCParams>{ID}{BN}*/":" { // Keyword of parameter
lineCount();
QCString keyw = QCString(yytext).stripWhiteSpace();
current->name += keyw;
if (current->argList->getLast()->type.isEmpty())
{
current->argList->getLast()->type="id";
}
Argument *a = new Argument;
a->attrib=(QCString)"["+keyw+"]";
current->argList->append(a);
}
<ObjCParams>{ID}{BN}* { // name of parameter
lineCount();
......@@ -1085,17 +1092,8 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
<ObjCParams>"(" {
BEGIN( ObjCParamType );
}
<ObjCParams>{BN}* {
lineCount();
if (current->argList->getLast()->type.isEmpty())
{
current->argList->getLast()->type="id";
}
Argument *a = new Argument;
current->argList->append(a);
}
<ObjCParamType>[^)]* {
current->argList->last()->type=yytext;
current->argList->getLast()->type=yytext;
}
<ObjCParamType>")"{B}* {
BEGIN( ObjCParams );
......@@ -1107,6 +1105,9 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
BEGIN( Function );
}
<ObjCMethod,ObjCParams>"{" { // start of a method body
//printf("Type=%s Name=%s args=%s\n",
// current->type.data(),current->name.data(),argListToString(current->argList).data()
// );
unput('{');
BEGIN( Function );
}
......@@ -3940,14 +3941,14 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
current->groupDocType = Entry::GROUPDOC_NORMAL;
BEGIN( GroupDocArg1 );
}
<Doc,PageDoc,ExampleDoc,JavaDoc>{B}*{CMD}"addtogroup"{B}+ {
<Doc,PageDoc,JavaDoc>{B}*{CMD}"addtogroup"{B}+ {
current->section = Entry::GROUPDOC_SEC;
current->fileName = yyFileName;
current->startLine = yyLineNr;
current->groupDocType = Entry::GROUPDOC_ADD;
BEGIN( GroupDocArg1 );
}
<Doc,PageDoc,ExampleDoc,JavaDoc>{B}*{CMD}"weakgroup"{B}+ {
<Doc,PageDoc,JavaDoc>{B}*{CMD}"weakgroup"{B}+ {
current->section = Entry::GROUPDOC_SEC;
current->fileName = yyFileName;
current->startLine = yyLineNr;
......@@ -4163,7 +4164,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
}
<ExampleDocArg1>{FILE} {
current->name = stripQuotes(yytext);
BEGIN( ExampleDoc );
BEGIN( PageDoc );
}
<ClassDoc,Doc,JavaDoc>{B}*{CMD}"relate"[sd]{B}* {
lastDocRelContext = YY_START;
......@@ -4362,22 +4363,22 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
<PageDoc>{CMD}"refitem".*"\n" {
current->doc+=yytext;
}
<ExampleDoc,ClassDoc,PageDoc,Doc,JavaDoc>{CMD}"section"{B}+ {
<ClassDoc,PageDoc,Doc,JavaDoc>{CMD}"section"{B}+ {
//sectionType=SectionInfo::Section;
current->doc+=yytext;
BEGIN(SectionLabel);
}
<ExampleDoc,ClassDoc,PageDoc,Doc,JavaDoc>{CMD}"subsection"{B}+ {
<ClassDoc,PageDoc,Doc,JavaDoc>{CMD}"subsection"{B}+ {
//sectionType=SectionInfo::Subsection;
current->doc+=yytext;
BEGIN(SectionLabel);
}
<ExampleDoc,ClassDoc,PageDoc,Doc,JavaDoc>{CMD}"subsubsection"{B}+ {
<ClassDoc,PageDoc,Doc,JavaDoc>{CMD}"subsubsection"{B}+ {
//sectionType=SectionInfo::Subsubsection;
current->doc+=yytext;
BEGIN(SectionLabel);
}
<ExampleDoc,ClassDoc,PageDoc,Doc,JavaDoc>{CMD}"paragraph"{B}+ {
<ClassDoc,PageDoc,Doc,JavaDoc>{CMD}"paragraph"{B}+ {
//sectionType=SectionInfo::Paragraph;
current->doc+=yytext;
BEGIN(SectionLabel);
......@@ -4418,7 +4419,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
current->brief.resize(0);
BEGIN(lastDocContext);
}
<ExampleDoc,Doc,PageDoc,JavaDoc,ClassDoc>{CMD}"anchor"{B}+ {
<Doc,PageDoc,JavaDoc,ClassDoc>{CMD}"anchor"{B}+ {
lastAnchorContext = YY_START;
//sectionType=SectionInfo::Anchor;
current->doc+=yytext;
......@@ -4640,9 +4641,9 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
sectionTitle+=yytext;
current->doc+=yytext;
}
<ExampleDoc,PageDoc,ClassDoc>"\n" { yyLineNr++ ; current->doc+=yytext; }
<ExampleDoc,PageDoc,ClassDoc>[a-z_A-Z0-9 \t]+ { current->doc += yytext; }
<ExampleDoc,PageDoc>{CMD}"ingroup"{B}+ {
<PageDoc,ClassDoc>"\n" { yyLineNr++ ; current->doc+=yytext; }
<PageDoc,ClassDoc>[a-z_A-Z0-9 \t]+ { current->doc += yytext; }
<PageDoc>{CMD}"ingroup"{B}+ {
lastGroupContext = YY_START;
lineCount();
BEGIN( GroupName );
......@@ -4663,20 +4664,20 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
endGroup();
memberGroupHeader.resize(0);
}
<ExampleDoc,PageDoc,ClassDoc>. { current->doc += yytext; }
<Doc,JavaDoc,LineDoc,ExampleDoc,PageDoc,ClassDoc>^{B}*"//"
<Doc,ExampleDoc,PageDoc,ClassDoc>"//" { current->doc += yytext; }
<PageDoc,ClassDoc>. { current->doc += yytext; }
<Doc,JavaDoc,LineDoc,PageDoc,ClassDoc>^{B}*"//"
<Doc,PageDoc,ClassDoc>"//" { current->doc += yytext; }
<LineDoc,JavaDoc,ClassDocBrief>"//" { current->brief += yytext; }
<Doc,JavaDoc,LineDoc,ExampleDoc,ClassDocBrief,PageDoc,ClassDoc,AfterDoc,AfterDocLine,AfterDocBrief>("\\\\"|"@@")"f"[$\[\]] {
<Doc,JavaDoc,LineDoc,ClassDocBrief,PageDoc,ClassDoc,AfterDoc,AfterDocLine,AfterDocBrief>("\\\\"|"@@")"f"[$\[\]] {
current->doc += yytext;
}
<Doc,JavaDoc,LineDoc,ExampleDoc,ClassDocBrief,PageDoc,ClassDoc,AfterDoc,AfterDocLine,AfterDocBrief,CopyArgComment,CopyArgCommentLine>{CMD}"f$" {
<Doc,JavaDoc,LineDoc,ClassDocBrief,PageDoc,ClassDoc,AfterDoc,AfterDocLine,AfterDocBrief,CopyArgComment,CopyArgCommentLine>{CMD}"f$" {
lastFormulaContext = YY_START;
formulaText="$";
insideFormula=TRUE;
BEGIN(ReadFormulaShort);
}
<Doc,JavaDoc,LineDoc,ExampleDoc,ClassDocBrief,PageDoc,ClassDoc,AfterDoc,AfterDocLine,AfterDocBrief,CopyArgComment,CopyArgCommentLine>{CMD}"f[" {
<Doc,JavaDoc,LineDoc,ClassDocBrief,PageDoc,ClassDoc,AfterDoc,AfterDocLine,AfterDocBrief,CopyArgComment,CopyArgCommentLine>{CMD}"f[" {
lastFormulaContext = YY_START;
formulaText="\\[";
insideFormula=TRUE;
......@@ -4742,7 +4743,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
}
<ReadFormulaLong>\n { formulaText+=*yytext; yyLineNr++; }
<ReadFormulaLong,ReadFormulaShort>. { formulaText+=*yytext; }
<ExampleDoc,PageDoc,ClassDocBrief,ClassDoc,ReadFormulaShort,ReadFormulaLong>{B}*"*/" {
<PageDoc,ClassDocBrief,ClassDoc,ReadFormulaShort,ReadFormulaLong>{B}*"*/" {
checkDocs();
//printf("current->section=%x\n",current->section);
if (YY_START==SkipCode) // premature end of code block
......@@ -4814,11 +4815,11 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
<PageDocTitle>"</"{TITLE}">" { BEGIN( PageDoc ); }
/* escaped versions of the conditional commands (for putting them in the docs) */
<ClassDoc,Doc,AfterDoc,PageDoc,ExampleDoc>{CMD}{CMD}"if"/[^a-z_A-Z0-9] { current->doc+=yytext; }
<ClassDoc,Doc,AfterDoc,PageDoc,ExampleDoc>{CMD}{CMD}"ifnot"/[^a-z_A-Z0-9] { current->doc+=yytext; }
<ClassDoc,Doc,AfterDoc,PageDoc,ExampleDoc>{CMD}{CMD}"elseif"/[^a-z_A-Z0-9] { current->doc+=yytext; }
<ClassDoc,Doc,AfterDoc,PageDoc,ExampleDoc>{CMD}{CMD}"else"/[^a-z_A-Z0-9] { current->doc+=yytext; }
<ClassDoc,Doc,AfterDoc,PageDoc,ExampleDoc>{CMD}{CMD}"endif"/[^a-z_A-Z0-9] { current->doc+=yytext; }
<ClassDoc,Doc,AfterDoc,PageDoc>{CMD}{CMD}"if"/[^a-z_A-Z0-9] { current->doc+=yytext; }
<ClassDoc,Doc,AfterDoc,PageDoc>{CMD}{CMD}"ifnot"/[^a-z_A-Z0-9] { current->doc+=yytext; }
<ClassDoc,Doc,AfterDoc,PageDoc>{CMD}{CMD}"elseif"/[^a-z_A-Z0-9] { current->doc+=yytext; }
<ClassDoc,Doc,AfterDoc,PageDoc>{CMD}{CMD}"else"/[^a-z_A-Z0-9] { current->doc+=yytext; }
<ClassDoc,Doc,AfterDoc,PageDoc>{CMD}{CMD}"endif"/[^a-z_A-Z0-9] { current->doc+=yytext; }
<LineDoc,JavaDoc>{CMD}{CMD}"if"/[^a-z_A-Z0-9] { current->brief+=yytext; }
<LineDoc,JavaDoc>{CMD}{CMD}"ifnot"/[^a-z_A-Z0-9] { current->brief+=yytext; }
<LineDoc,JavaDoc>{CMD}{CMD}"elseif"/[^a-z_A-Z0-9] { current->brief+=yytext; }
......@@ -4826,15 +4827,15 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
<LineDoc,JavaDoc>{CMD}{CMD}"endif"/[^a-z_A-Z0-9] { current->brief+=yytext; }
/* conditional commands */
<ClassDoc,LineDoc,AfterDocLine,AfterDocBrief,Doc,JavaDoc,AfterDoc,PageDoc,ExampleDoc>{CMD}"if"{B}+ {
<ClassDoc,LineDoc,AfterDocLine,AfterDocBrief,Doc,JavaDoc,AfterDoc,PageDoc>{CMD}"if"{B}+ {
lastIfContext = YY_START;
BEGIN(IfGuard);
}
<ClassDoc,LineDoc,AfterDocLine,AfterDocBrief,Doc,JavaDoc,AfterDoc,PageDoc,ExampleDoc>{CMD}"ifnot"{B}+ {
<ClassDoc,LineDoc,AfterDocLine,AfterDocBrief,Doc,JavaDoc,AfterDoc,PageDoc>{CMD}"ifnot"{B}+ {
lastIfContext = YY_START;
BEGIN(IfNotGuard);
}
<ClassDoc,LineDoc,AfterDocLine,AfterDocBrief,Doc,JavaDoc,AfterDoc,PageDoc,ExampleDoc>{CMD}"if"(\r?)\n |
<ClassDoc,LineDoc,AfterDocLine,AfterDocBrief,Doc,JavaDoc,AfterDoc,PageDoc>{CMD}"if"(\r?)\n |
<IfGuard>\n {
warn(yyFileName,yyLineNr,"Missing guard for if statement!");
yyLineNr++;
......@@ -4897,17 +4898,17 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
yyLineNr++;
}
<SkipSection>"//"|"*/"
<ClassDoc,ClassDocBrief,LineDoc,AfterDocLine,AfterDocBrief,Doc,JavaDoc,AfterDoc,PageDoc,ExampleDoc>{CMD}"elseif"/[^a-z_A-Z0-9] {
<ClassDoc,ClassDocBrief,LineDoc,AfterDocLine,AfterDocBrief,Doc,JavaDoc,AfterDoc,PageDoc>{CMD}"elseif"/[^a-z_A-Z0-9] {
// previous section enabled => skip now
depthIf=1;
BEGIN(SkipSection);
}
<ClassDoc,ClassDocBrief,LineDoc,AfterDocLine,AfterDocBrief,Doc,JavaDoc,AfterDoc,PageDoc,ExampleDoc>{CMD}"else"/[^a-z_A-Z0-9] {
<ClassDoc,ClassDocBrief,LineDoc,AfterDocLine,AfterDocBrief,Doc,JavaDoc,AfterDoc,PageDoc>{CMD}"else"/[^a-z_A-Z0-9] {
// section was enabled => skip now
depthIf=1;
BEGIN(SkipSection);
}
<ClassDoc,ClassDocBrief,LineDoc,AfterDocLine,AfterDocBrief,Doc,JavaDoc,AfterDoc,PageDoc,ExampleDoc>{CMD}"endif"/[^a-z_A-Z0-9] {
<ClassDoc,ClassDocBrief,LineDoc,AfterDocLine,AfterDocBrief,Doc,JavaDoc,AfterDoc,PageDoc>{CMD}"endif"/[^a-z_A-Z0-9] {
// section enabled => absorb endif
}
......@@ -5222,7 +5223,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
current->doc+="\\internal";
}
}
<Doc,JavaDoc,ExampleDoc,PageDoc,ClassDoc,AfterDoc>{CMD}"internal" {
<Doc,JavaDoc,PageDoc,ClassDoc,AfterDoc>{CMD}"internal" {
if (!Config_getBool("INTERNAL_DOCS"))
{
lastInternalDocContext = YY_START;
......@@ -5294,10 +5295,10 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
unput('/');unput('*');
BEGIN( tmpDocType );
}
<Doc,JavaDoc,ClassDoc,PageDoc,ExampleDoc,ReadFormulaShort,ReadFormulaLong,AfterDoc>^{B}*(("//"{B}*)?)"*"+[ \t]*"-"("#")?{B}+ {
<Doc,JavaDoc,ClassDoc,PageDoc,ReadFormulaShort,ReadFormulaLong,AfterDoc>^{B}*(("//"{B}*)?)"*"+[ \t]*"-"("#")?{B}+ {
current->doc += yytext;
}
<Doc,JavaDoc,ClassDoc,PageDoc,ExampleDoc,ReadFormulaShort,ReadFormulaLong,AfterDoc>^{B}*(("//"{B}*)?)"*"+[ \t]*"."{B}*\n {
<Doc,JavaDoc,ClassDoc,PageDoc,ReadFormulaShort,ReadFormulaLong,AfterDoc>^{B}*(("//"{B}*)?)"*"+[ \t]*"."{B}*\n {
current->doc += yytext;
yyLineNr++;
}
......@@ -5307,12 +5308,12 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
<ClassDocBrief,AfterDocBrief>^{B}*(("//"{B}*)?)"*"+[ \t]*"."{B}*\n {
current->brief += "."; yyLineNr++;
}
<Doc,JavaDoc,ClassDoc,PageDoc,ExampleDoc,ReadFormulaShort,ReadFormulaLong,ClassDocBrief,AfterDoc,AfterDocBrief>^{B}*(("//"{B}*)?)"*"+/[^/]
<Doc,JavaDoc,ClassDoc,PageDoc,ExampleDoc,ReadFormulaShort,ReadFormulaLong,ClassDocBrief,AfterDoc,AfterDocBrief>^{B}*(("//"{B}*)?)"*"+{B}+ {
<Doc,JavaDoc,ClassDoc,PageDoc,ReadFormulaShort,ReadFormulaLong,ClassDocBrief,AfterDoc,AfterDocBrief>^{B}*(("//"{B}*)?)"*"+/[^/]
<Doc,JavaDoc,ClassDoc,PageDoc,ReadFormulaShort,ReadFormulaLong,ClassDocBrief,AfterDoc,AfterDocBrief>^{B}*(("//"{B}*)?)"*"+{B}+ {
current->doc+=' ';
}
<Doc,ClassDoc,PageDoc,ExampleDoc,AfterDoc>"\\"[a-z_A-Z][a-z_A-Z0-9]*[\\] { // directory type of text
<Doc,ClassDoc,PageDoc,AfterDoc>"\\"[a-z_A-Z][a-z_A-Z0-9]*[\\] { // directory type of text
current->doc+=yytext;
}
/*
......@@ -5328,13 +5329,13 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
}
}
*/
<Doc,ClassDoc,PageDoc,ExampleDoc,AfterDoc,CopyArgComment>{CMD}{CMD}[a-z_A-Z][a-z_A-Z0-9]* { /* escaped command */
<Doc,ClassDoc,PageDoc,AfterDoc,CopyArgComment>{CMD}{CMD}[a-z_A-Z][a-z_A-Z0-9]* { /* escaped command */
if (YY_START==CopyArgComment)
fullArgString+=yytext;
else
current->doc+=yytext;
}
<Doc,ClassDoc,PageDoc,ExampleDoc,AfterDoc,CopyArgComment>{CMD}[a-z_A-Z][a-z_A-Z0-9]* {
<Doc,ClassDoc,PageDoc,AfterDoc,CopyArgComment>{CMD}[a-z_A-Z][a-z_A-Z0-9]* {
bool handled=FALSE;
if ( useOverrideCommands)
{
......@@ -5422,7 +5423,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
current->brief+=yytext;
//}
}
<DefLineDoc,LineDoc,ClassDoc,PageDoc,ExampleDoc,Doc>"/*"|"//" { current->doc += yytext; }
<DefLineDoc,LineDoc,ClassDoc,PageDoc,Doc>"/*"|"//" { current->doc += yytext; }
<SkipCxxComment>.*/\n {
BEGIN( lastCContext ) ;
}
......
......@@ -1127,7 +1127,7 @@ static bool findOperator(const QCString &s,int i)
while (b<i) // check if there are only spaces inbetween
// the operator and the >
{
if (!isspace(s.at(b))) return FALSE;
if (!isspace((uchar)s.at(b))) return FALSE;
b++;
}
return TRUE;
......@@ -1147,20 +1147,20 @@ QCString removeRedundantWhiteSpace(const QCString &s)
char c=s.at(i);
if (csp<6 && c==constScope[csp]) csp++; else csp=0;
if (i<l-2 && c=='<' && // current char is a <
(isId(s.at(i+1)) || isspace(s.at(i+1))) && // next char is an id char or space
(isId(s.at(i+1)) || isspace((uchar)s.at(i+1))) && // next char is an id char or space
(i<8 || !findOperator(s,i)) // string in front is not "operator"
)
{
result+="< "; // insert extra space for layouting (nested) templates
}
else if (i>0 && c=='>' && // current char is a >
(isId(s.at(i-1)) || isspace(s.at(i-1)) || s.at(i-1)=='*' || s.at(i-1)=='&') && // prev char is an id char or space
(isId(s.at(i-1)) || isspace((uchar)s.at(i-1)) || s.at(i-1)=='*' || s.at(i-1)=='&') && // prev char is an id char or space
(i<8 || !findOperator(s,i)) // string in front is not "operator"
)
{
result+=" >"; // insert extra space for layouting (nested) templates
}
else if (i>0 && c==',' && !isspace(s.at(i-1))
else if (i>0 && c==',' && !isspace((uchar)s.at(i-1))
&& ((i<l-1 && isId(s.at(i+1)))
|| (i<l-2 && s.at(i+1)=='$' && isId(s.at(i+2))) // for PHP
|| (i<l-3 && s.at(i+1)=='&' && s.at(i+2)=='$' && isId(s.at(i+3))))) // for PHP
......@@ -1186,7 +1186,7 @@ QCString removeRedundantWhiteSpace(const QCString &s)
result+=" :";
csp=0;
}
else if (!isspace(c) ||
else if (!isspace((uchar)c) ||
( i>0 && i<l-1 &&
(isId(s.at(i-1)) || s.at(i-1)==')' || s.at(i-1)==',' || s.at(i-1)=='>' || s.at(i-1)==']')
&& (isId(s.at(i+1)) || (i<l-2 && s.at(i+1)=='$' && isId(s.at(i+2)))
......@@ -2247,7 +2247,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA,
}
else if (dstPos<dstAType.length())
{
if (!isspace(dstAType.at(dstPos))) // maybe the names differ
if (!isspace((uchar)dstAType.at(dstPos))) // maybe the names differ
{
if (!dstA->name.isEmpty()) // dst has its name separated from its type
{
......@@ -2274,7 +2274,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA,
}
else if (srcPos<srcAType.length())
{
if (!isspace(srcAType.at(srcPos))) // maybe the names differ
if (!isspace((uchar)srcAType.at(srcPos))) // maybe the names differ
{
if (!srcA->name.isEmpty()) // src has its name separated from its type
{
......@@ -2646,7 +2646,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
{
delete argList; argList=0;
}
if (mdist==maxInheritanceDepth && !strcmp(args,"()"))
if (mdist==maxInheritanceDepth && args && strcmp(args,"()")!=0)
// no exact match found, but if args="()" an arbitrary member will do
{
//printf(" >Searching for arbitrary member\n");
......@@ -2746,7 +2746,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
}
}
}
if (!found && !strcmp(args,"()"))
if (!found && args && !strcmp(args,"()"))
// no exact match found, but if args="()" an arbitrary
// member will do
{
......@@ -2812,7 +2812,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
}
}
}
if (members.count()!=1 && !strcmp(args,"()"))
if (members.count()!=1 && args && !strcmp(args,"()"))
{
// no exact match found, but if args="()" an arbitrary
// member will do
......@@ -3548,11 +3548,12 @@ QCString escapeCharsInString(const char *name,bool allowDots)
}
/*! This function determines the file name on disk of an item
* given its name, which could be a class name with templete
* given its name, which could be a class name with template
* arguments, so special characters need to be escaped.
*/
QCString convertNameToFile(const char *name,bool allowDots)
{
QCString result;
if (Config_getBool("SHORT_NAMES"))
{
static QDict<void> usedNames(10007);
......@@ -3569,13 +3570,75 @@ QCString convertNameToFile(const char *name,bool allowDots)
{
num = *(int*)&value;
}
QCString result;
result.sprintf("a%05d",num);
return result;
}
else // long names
{
return escapeCharsInString(name,allowDots);
result=escapeCharsInString(name,allowDots);
}
if (Config_getBool("CREATE_SUBDIRS"))
{
if (Doxygen::htmlDirMap==0)
{
Doxygen::htmlDirMap=new QDict<int>(100003);
Doxygen::htmlDirMap->setAutoDelete(TRUE);
}
static int curDirNum=0;
int *dirNum = Doxygen::htmlDirMap->find(result);
int l1Dir=0,l2Dir=0;
if (dirNum==0) // new name
{
Doxygen::htmlDirMap->insert(result,new int(curDirNum));
l1Dir = (curDirNum)%10;
l2Dir = ((curDirNum)/10)%10;
curDirNum++;
}
else // existing name
{
l1Dir = (*dirNum)%10;
l2Dir = ((*dirNum)/10)%10;
}
result.prepend(QCString().sprintf("d%d/d%d/",l1Dir,l2Dir));
}
return result;
}
QCString relativePathToRoot(const char *name)
{
QCString result;
if (Config_getBool("CREATE_SUBDIRS"))
{
if (name==0)
{
return REL_PATH_TO_ROOT;
}
else
{
QCString n = name;
int i = n.findRev('/');
if (i!=-1)
{
result=REL_PATH_TO_ROOT;
}
}
}
return result;
}
void createSubDirs(QDir &d)
{
if (Config_getBool("CREATE_SUBDIRS"))
{
// create 100 subdirectories
int l1,l2;
for (l1=0;l1<10;l1++)
{
d.mkdir(QString().sprintf("d%d",l1));
for (l2=0;l2<10;l2++)
{
d.mkdir(QString().sprintf("d%d/d%d",l1,l2));
}
}
}
}
......@@ -4714,3 +4777,13 @@ void replaceNamespaceAliases(QCString &scope,int i)
//printf("replaceNamespaceAliases() result=%s\n",scope.data());
}
QCString stripPath(const char *s)
{
QCString result=s;
int i=result.findRev('/');
if (i!=-1)
{
result=result.mid(i+1);
}
return result;
}
......@@ -49,6 +49,7 @@ class MemberNameInfoSDict;
struct ListItemInfo;
class PageDef;
struct SectionInfo;
class QDir;
//--------------------------------------------------------------------
......@@ -213,6 +214,11 @@ int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item);
int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item,
const QCString &explicitScopePart);
int computeQualifiedIndex(const QString &name);
void addDirPrefix(QCString &fileName);
QCString relativePathToRoot(const char *name);
#define REL_PATH_TO_ROOT "../../"
void createSubDirs(QDir &d);
QCString stripPath(const char *s);
#endif
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