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

Release-1.5.2-20070610

parent 0b087b99
DOXYGEN Version 1.5.2-20070506
DOXYGEN Version 1.5.2-20070610
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (06 May 2007)
Dimitri van Heesch (10 June 2007)
......@@ -54,26 +54,24 @@ install: doxywizard_install
$(INSTTOOL) -m 755 bin/doxygen $(INSTALL)/bin
$(INSTTOOL) -m 755 bin/doxytag $(INSTALL)/bin
$(INSTTOOL) -d $(INSTALL)/$(MAN1DIR)
cat doc/doxygen.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > $(INSTALL)/$(MAN1DIR)/doxygen.1 ; \
cat doc/doxytag.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > $(INSTALL)/$(MAN1DIR)/doxytag.1 ; \
cat doc/doxywizard.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > $(INSTALL)/$(MAN1DIR)/doxywizard.1 ;
cat doc/doxygen.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" doxygen.1
$(INSTTOOL) -m 644 doxygen.1 $(INSTALL)/$(MAN1DIR)/doxygen.1
rm doxygen.1
cat doc/doxytag.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" doxytag.1
$(INSTTOOL) -m 644 doxytag.1 $(INSTALL)/$(MAN1DIR)/doxytag.1
rm doxytag.1
cat doc/doxywizard.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" doxywizard.1
$(INSTTOOL) -m 644 doxywizard.1 $(INSTALL)/$(MAN1DIR)/doxywizard.1
rm doxywizard
install_docs:
$(INSTTOOL) -d $(DOCDIR)
$(MAKE) -C examples
$(MAKE) -C doc
$(MAKE) -C latex
cp latex/doxygen_manual.pdf $(DOCDIR)
#cp -r doc $(DOCDIR)
$(INSTTOOL) -m 644 latex/doxygen_manual.pdf $(DOCDIR)
cp -r examples $(DOCDIR)
cp -r html $(DOCDIR)
#echo "DOXYGEN = $(INSTALL)" > $(DOCDIR)/doc/Makefile
#echo "DOXYDOCS = .." >> $(DOCDIR)/doc/Makefile
#echo "VERSION = $(VERSION)" >> $(DOCDIR)/doc/Makefile
#echo "PERL = $(PERL)" >> $(DOCDIR)/doc/Makefile
#cat doc/Makefile.in >> $(DOCDIR)/doc/Makefile
#rm -rf $(DOCDIR)/doc
#rm -rf $(DOCDIR)/latex
docs: FORCE
cd examples ; $(MAKE)
......
DOXYGEN Version 1.5.2_20070506
DOXYGEN Version 1.5.2_20070610
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) (06 May 2007)
Dimitri van Heesch (dimitri@stack.nl) (10 June 2007)
......@@ -20,7 +20,7 @@ doxygen_version_minor=5
doxygen_version_revision=2
#NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
doxygen_version_mmn=20070506
doxygen_version_mmn=20070610
bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
......@@ -214,10 +214,7 @@ if test -z "$f_platform"; then
UNIX_SV:4.2*)
f_platform=unixware-g++
;;
Cygwin:*)
f_platform=win32-g++
;;
CYGWIN:*)
Cygwin:*|CYGWIN:*)
f_platform=win32-g++
;;
*MiNT:*)
......
......@@ -33,7 +33,7 @@ CASE_SENSE_NAMES = NO
IMAGE_PATH = .
INPUT = index.doc install.doc starting.doc docblocks.doc lists.doc \
grouping.doc formulas.doc diagrams.doc preprocessing.doc \
autolink.doc output.doc external.doc faq.doc trouble.doc history.doc features.doc \
autolink.doc output.doc custcmd.doc external.doc faq.doc trouble.doc history.doc features.doc \
doxygen_usage.doc doxytag_usage.doc \
doxywizard_usage.doc installdox_usage.doc \
config.doc commands.doc htmlcmds.doc xmlcmds.doc language.doc \
......
......@@ -163,6 +163,7 @@ followed by the descriptions of the tags grouped by category.
\refitem cfg_man_extension MAN_EXTENSION
\refitem cfg_man_links MAN_LINKS
\refitem cfg_man_output MAN_OUTPUT
\refitem cfg_max_dot_graph_depth MAX_DOT_GRAPH_DEPTH
\refitem cfg_max_initializer_lines MAX_INITIALIZER_LINES
\refitem cfg_mscgen_path MSCGEN_PATH
\refitem cfg_multiline_cpp_is_brief MULTILINE_CPP_IS_BRIEF
......@@ -1773,8 +1774,21 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
The \c MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of
nodes that will be shown in the graph. If the number of nodes in a graph
becomes larger than this value, doxygen will truncate the graph, which is
visualized by representing a node as a red box. Note that doxygen will always
show the root nodes and its direct children regardless of this setting.
visualized by representing a node as a red box. Note that doxygen if the number
of direct children of the root node in a graph is already larger than
\c MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note
that the size of a graph can be further restricted by \c MAX_DOT_GRAPH_DEPTH.
\anchor cfg_max_dot_graph_depth
<dt>\c MAX_DOT_GRAPH_DEPTH <dd>
\addindex MAX_DOT_GRAPH_DEPTH
The \c MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
graphs generated by dot. A depth value of 3 means that only nodes reachable
from the root by following a path via at most 3 edges will be shown. Nodes
that lay further from the root node will be omitted. Note that setting this
option to 1 or 2 may greatly reduce the computation time needed for large
code bases. Also note that the size of a graph can be further restricted by
\c DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction (the default).
\anchor cfg_dot_image_format
<dt>\c DOT_IMAGE_FORMAT <dd>
......
......@@ -75,6 +75,7 @@ The first part forms a user manual:
and members in the documentation.
<li>Section \ref output shows how to generate the various output formats
supported by doxygen.
<li>Section \ref custcmd show how to define and use custom commands in your comments.
<li>Section \ref external explains how to let doxygen create links to externally generated documentation.
<li>Section \ref faq gives answers to frequently asked questions.
<li>Section \ref trouble tells you what to do when you have problems.
......
......@@ -38,14 +38,17 @@ If you downloaded the source distribution, you need at least the
following to build the executable:
<ul>
<li>The <a href="ftp://prep.ai.mit.edu/pub/gnu/">GNU</a> tools
flex, bison and make
flex, bison and GNU make, and strip
\addindex flex
\addindex bison
\addindex make
\addindex strip
<li>In order to generate a Makefile for your platform, you need
<a href="http://www.perl.com/">perl</a>
\latexonly(see {\tt http://www.perl.com/})\endlatexonly.
\addindex perl
<li>The configure script assume the availibility of standard Unix tools such
as sed, date, find, uname, mv, cp, cat, echo, tr, cd, and rm.
</ul>
To take full advantage of doxygen's features the following additional
......@@ -56,7 +59,7 @@ tools should be installed.
<A HREF="http://www.trolltech.com/products/qt.html">Qt</A>
\latexonly(see {\tt http://www.trolltech.com/products/qt.html})\endlatexonly
\addindex Qt
version 3.2 or higher.
version 3.3 or higher.
This is needed to build the GUI front-end doxywizard.
<li>A \f$\mbox{\LaTeX}\f$ distribution: for instance
<a href="http://www.tug.org/interest.html#free">teTeX 1.0</a>
......@@ -70,8 +73,11 @@ tools should be installed.
If you compile graphviz yourself, make sure you do include
freetype support (which requires the freetype library and header files),
otherwise the graphs will not render proper text labels.
<li>The ghostscript interpreter. To be found at
<li>For formulas or if you do not wish to use pdflatex, the ghostscript interpreter
is needed. You can find it at
<a href="http://www.ghostscript.com/">www.ghostscript.com</a>.
<li>In order to generate doxygen's own documentation, Python is needed, you
can find it at <a href="http://www.python.org">www.python.org</a>.
</ul>
Compilation is now done by performing the following steps:
......@@ -104,7 +110,7 @@ Compilation is now done by performing the following steps:
See the <code>PLATFORMS</code> file for a list of possible platform
options.
If you have Qt-3.2.x or higher installed and want to build the GUI
If you have Qt-3.3.x installed and want to build the GUI
front-end, you should run the configure script with
the <code>--with-doxywizard</code> option:
......@@ -136,13 +142,11 @@ Compilation is now done by performing the following steps:
To let doxygen generate the HTML documentation.
\note You will need the stream editor <code>sed</code> for this,
but this should be available on any Unix platform.
The HTML directory of the distribution will now contain the html
documentation (just point a HTML browser to the file
<code>index.html</code> in the
html directory).
html directory). You will need the <code>python</code> interpreter
for this.
<li>Optional: Generate a PDF version of the manual
(you will need <code>pdflatex</code>, <code>makeindex</code>, and
......
......@@ -39,7 +39,11 @@ Here is the list of tags supported by doxygen:
file. Ignored by doxygen at the moment.
<li><tt>\<item\></tt> List item. Can only be used inside a <tt>\<list\></tt> context.
<li><tt>\<list type="type"\></tt> Starts a list, supported types are <tt>bullet</tt>
or <tt>number</tt>. A list consists of a number of <tt>\<item\></tt> tags.
or <tt>number</tt> and <tt>table</tt>.
A list consists of a number of <tt>\<item\></tt> tags.
A list of type table, is a two column table which can have
a header.
<li><tt>\<listheader\></tt> Starts the header of a list of type "table".
<li><tt>\<para\></tt> Identifies a paragraph of text.
<li><tt>\<param name="paramName"\></tt> Marks a piece of text as the documentation
for parameter "paramName". Similar to
......@@ -56,6 +60,7 @@ Here is the list of tags supported by doxygen:
to "member". Similar to using \ref cmdsa "\\sa" member.
<li><tt>\<summary\></tt> Identifies the brief description.
Similar to using \ref cmdbrief "\\brief".
<li><tt>\<term\></tt> Part of a <tt>\<list\></tt> command.
<li><tt>\<value\></tt> Identifies a property. Ignored by doxygen.
</ul>
......
This diff is collapsed.
......@@ -310,6 +310,7 @@ class ClassDef : public Definition
void mergeMembers();
void distributeMemberGroupDocumentation();
void writeDocumentation(OutputList &ol);
void writeClassDiagrams(OutputList &ol);
void writeDocumentationForInnerClasses(OutputList &ol);
void writeMemberDocumentation(OutputList &ol);
void writeMemberPages(OutputList &ol);
......
......@@ -162,7 +162,8 @@ CommandMap htmlTagMap[] =
{ "exception", XML_EXCEPTION },
{ "include", XML_INCLUDE },
{ "item", XML_ITEM },
{ "list", XML_LIST },
{ "list", XML_LIST }, // type="table|bullet|number"
{ "listheader", XML_LISTHEADER },
{ "para", XML_PARA },
{ "param", XML_PARAM },
{ "paramref", XML_PARAMREF },
......@@ -172,14 +173,15 @@ CommandMap htmlTagMap[] =
{ "see", XML_SEE },
{ "seealso", XML_SEEALSO },
{ "summary", XML_SUMMARY },
{ "term", XML_TERM },
{ "value", XML_VALUE },
{ 0, 0 }
};
//----------------------------------------------------------------------------
Mapper *Mappers::cmdMapper = new Mapper(cmdMap);
Mapper *Mappers::htmlTagMapper = new Mapper(htmlTagMap);
Mapper *Mappers::cmdMapper = new Mapper(cmdMap,TRUE);
Mapper *Mappers::htmlTagMapper = new Mapper(htmlTagMap,FALSE);
void Mappers::freeMappers()
{
......
......@@ -158,16 +158,18 @@ enum HtmlTagType
XML_INCLUDE = XML_CmdMask + 5,
XML_ITEM = XML_CmdMask + 6,
XML_LIST = XML_CmdMask + 7,
XML_PARA = XML_CmdMask + 8,
XML_PARAM = XML_CmdMask + 9,
XML_PARAMREF = XML_CmdMask + 10,
XML_PERMISSION = XML_CmdMask + 11,
XML_REMARKS = XML_CmdMask + 12,
XML_RETURNS = XML_CmdMask + 13,
XML_SEE = XML_CmdMask + 14,
XML_SEEALSO = XML_CmdMask + 15,
XML_SUMMARY = XML_CmdMask + 16,
XML_VALUE = XML_CmdMask + 17
XML_LISTHEADER = XML_CmdMask + 8,
XML_PARA = XML_CmdMask + 9,
XML_PARAM = XML_CmdMask + 10,
XML_PARAMREF = XML_CmdMask + 11,
XML_PERMISSION = XML_CmdMask + 12,
XML_REMARKS = XML_CmdMask + 13,
XML_RETURNS = XML_CmdMask + 14,
XML_SEE = XML_CmdMask + 15,
XML_SEEALSO = XML_CmdMask + 16,
XML_SUMMARY = XML_CmdMask + 17,
XML_TERM = XML_CmdMask + 18,
XML_VALUE = XML_CmdMask + 19
};
......@@ -177,11 +179,12 @@ class Mapper
int map(const char *n)
{
QCString name=n;
if (!m_cs) name=name.lower();
int *result;
return !name.isEmpty() && (result=m_map.find(name.lower())) ? *result: 0;
return !name.isEmpty() && (result=m_map.find(name)) ? *result: 0;
}
Mapper(const CommandMap *cm) : m_map(89)
Mapper(const CommandMap *cm,bool caseSensitive) : m_map(89), m_cs(caseSensitive)
{
m_map.setAutoDelete(TRUE);
const CommandMap *p = cm;
......@@ -193,6 +196,7 @@ class Mapper
}
private:
QDict<int> m_map;
bool m_cs;
};
struct Mappers
......
......@@ -61,6 +61,10 @@ static QCString g_blockName;
static int g_lastCommentContext;
static bool g_inSpecialComment;
static QCString g_aliasString;
static int g_blockCount;
static int g_lastBlockContext;
static void replaceCommentMarker(const char *s,int len)
{
const char *p=s;
......@@ -223,27 +227,11 @@ static QCString handleCondCmdInAliases(const QCString &s)
/** copies string \a s with length \a len to the output, while
* replacing any alias commands found in the string.
*/
static void replaceAliases(const char *s,int len)
static void replaceAliases(const char *s)
{
static QRegExp cmd("[@\\\\][a-z_A-Z][a-z_A-Z0-9]*");
QCString in=s;
int p=0,i,l;
while ((i=cmd.match(in,p,&l))!=-1)
{
copyToOutput(s+p,i-p);
QCString *pValue=Doxygen::aliasDict[in.mid(i+1,l-1)];
if (pValue)
{
QCString val = handleCondCmdInAliases(*pValue);
copyToOutput(val.data(),val.length());
}
else
{
copyToOutput(s+i,l);
}
p=i+l;
}
copyToOutput(s+p,len-p);
QCString result = resolveAliasCmd(s);
//printf("replaceAliases(%s)->'%s'\n",s,result.data());
copyToOutput(result,result.length());
}
......@@ -274,6 +262,7 @@ void replaceComment(int offset);
%x VerbatimCode
%x ReadLine
%x CondLine
%x ReadAliasArgs
%%
......@@ -300,8 +289,7 @@ void replaceComment(int offset);
}
g_blockHeadCol=g_col;
copyToOutput("/**",3);
//copyToOutput(yytext+i,yyleng-i);
replaceAliases(yytext+i,yyleng-i);
replaceAliases(yytext+i);
g_inSpecialComment=TRUE;
BEGIN(SComment);
}
......@@ -310,8 +298,7 @@ void replaceComment(int offset);
int i=17; //=strlen("//##Documentation");
g_blockHeadCol=g_col;
copyToOutput("/**",3);
//copyToOutput(yytext+i,yyleng-i);
replaceAliases(yytext+i,yyleng-i);
replaceAliases(yytext+i);
BEGIN(SComment);
}
<Scan>"//"/.*\n { /* one line C++ comment */
......@@ -521,17 +508,37 @@ void replaceComment(int offset);
if (*yytext=='\n') g_lineNr++;
BEGIN(g_condCtx);
}
<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]* { // expand alias
QCString *pValue=Doxygen::aliasDict[yytext+1];
if (pValue)
{
QCString val = handleCondCmdInAliases(*pValue);
copyToOutput(val.data(),val.length());
<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]* { // expand alias without arguments
replaceAliases(yytext);
}
else
<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]*"{" { // expand alias with arguments
g_lastBlockContext=YY_START;
g_blockCount=1;
g_aliasString=yytext;
BEGIN( ReadAliasArgs );
}
<ReadAliasArgs>[^{}\n\*]+ {
g_aliasString+=yytext;
}
<ReadAliasArgs>\n {
g_aliasString+=yytext;
g_lineNr++;
}
<ReadAliasArgs>"{" {
g_aliasString+=yytext;
g_blockCount++;
}
<ReadAliasArgs>"}" {
g_aliasString+=yytext;
g_blockCount--;
if (g_blockCount==0)
{
copyToOutput(yytext,yyleng);
replaceAliases(g_aliasString);
BEGIN( g_lastBlockContext );
}
}
<ReadAliasArgs>. {
g_aliasString+=yytext;
}
<ReadLine>. {
copyToOutput(yytext,yyleng);
......
......@@ -1078,12 +1078,13 @@ void Config::check()
s=aliasList.first();
while (s)
{
QRegExp re("[a-z_A-Z][a-z_A-Z0-9]*[ \t]*=");
QRegExp re1("[a-z_A-Z][a-z_A-Z0-9]*[ \t]*="); // alias without argument
QRegExp re2("[a-z_A-Z][a-z_A-Z0-9]*{[0-9]*}[ \t]*="); // alias with argument
QCString alias=s;
alias=alias.stripWhiteSpace();
if (alias.find(re)!=0)
if (alias.find(re1)!=0 && alias.find(re2)!=0)
{
config_err("Illegal alias format `%s'. Use \"name=value\"\n",
config_err("Illegal alias format `%s'. Use \"name=value\" or \"name(n)=value\", where n is the number of arguments\n",
alias.data());
}
s=aliasList.next();
......@@ -1250,16 +1251,12 @@ void Config::check()
Config_getBool("INLINE_INFO")=FALSE;
}
#if 0
if (Config_getString("RTF_OUTPUT_ENCODING").isEmpty())
{
Config_getString("RTF_OUTPUT_ENCODING")="ISO-8859-1";
}
if (Config_getString("LATEX_OUTPUT_ENCODING").isEmpty())
int &depth = Config_getInt("MAX_DOT_GRAPH_DEPTH");
if (depth==0)
{
Config_getString("LATEX_OUTPUT_ENCODING")="ISO-8859-1";
depth=1000;
}
#endif
// add default words if needed
QStrList &annotationFromBrief = Config_getList("ABBREVIATE_BRIEF");
......@@ -2072,7 +2069,9 @@ void Config::create()
"If the SOURCE_BROWSER tag is set to YES then a list of source files will \n"
"be generated. Documented entities will be cross-referenced with these sources. \n"
"Note: To get rid of all source code in the generated output, make sure also \n"
"VERBATIM_HEADERS is set to NO. \n",
"VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH \n"
"then you must also enable this option. If you don't then doxygen will produce \n"
"a warning and turn it on anyway \n",
FALSE
);
cb = addBool(
......@@ -2895,14 +2894,27 @@ void Config::create()
"The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of \n"
"nodes that will be shown in the graph. If the number of nodes in a graph \n"
"becomes larger than this value, doxygen will truncate the graph, which is \n"
"visualized by representing a node as a red box. Note that doxygen will always \n"
"show the root nodes and its direct children regardless of this setting. \n",
"visualized by representing a node as a red box. Note that doxygen if the number \n"
"of direct children of the root node in a graph is already larger than \n"
"MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note \n"
"that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. \n",
0,10000, 50
);
ci->addDependency("HAVE_DOT");
ci = addInt(
"MAX_DOT_GRAPH_DEPTH",
"The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the \n"
"graphs generated by dot. A depth value of 3 means that only nodes reachable \n"
"from the root by following a path via at most 3 edges will be shown. Nodes \n"
"that lay further from the root node will be omitted. Note that setting this \n"
"option to 1 or 2 may greatly reduce the computation time needed for large \n"
"code bases. Also note that the size of a graph can be further restricted by \n"
"DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n",
0,1000,0
);
ci->addDependency("HAVE_DOT");
addObsolete("MAX_DOT_GRAPH_WIDTH");
addObsolete("MAX_DOT_GRAPH_HEIGHT");
addObsolete("MAX_DOT_GRAPH_DEPTH");
cb = addBool(
"DOT_TRANSPARENT",
"Set the DOT_TRANSPARENT tag to YES to generate images with a transparent \n"
......
......@@ -536,6 +536,18 @@ static bool insideOL(DocNode *n)
//---------------------------------------------------------------------------
static bool insideTable(DocNode *n)
{
while (n)
{
if (n->kind()==DocNode::Kind_HtmlTable) return TRUE;
n=n->parent();
}
return FALSE;
}
//---------------------------------------------------------------------------
///*! Returns TRUE iff node n is a child of a language node */
//static bool insideLang(DocNode *n)
//{
......@@ -2820,6 +2832,43 @@ int DocHtmlCell::parse()
return retval;
}
int DocHtmlCell::parseXml()
{
int retval=RetVal_OK;
g_nodeStack.push(this);
DBG(("DocHtmlCell::parseXml() start\n"));
// parse one or more paragraphs
bool isFirst=TRUE;
DocPara *par=0;
do
{
par = new DocPara(this);
if (isFirst) { par->markFirst(); isFirst=FALSE; }
m_children.append(par);
retval=par->parse();
if (retval==TK_HTMLTAG)
{
int tagId=Mappers::htmlTagMapper->map(g_token->name);
if (tagId==XML_ITEM && g_token->endTag) // found </item> tag
{
retval=TK_NEWPARA; // ignore the tag
}
else if (tagId==XML_DESCRIPTION && g_token->endTag) // found </description> tag
{
retval=TK_NEWPARA; // ignore the tag
}
}
}
while (retval==TK_NEWPARA);
if (par) par->markLast();
DBG(("DocHtmlCell::parseXml() end\n"));
DocNode *n=g_nodeStack.pop();
ASSERT(n==this);
return retval;
}
//---------------------------------------------------------------------------
int DocHtmlRow::parse()
......@@ -2888,6 +2937,68 @@ endrow:
return retval;
}
int DocHtmlRow::parseXml(bool isHeading)
{
int retval=RetVal_OK;
g_nodeStack.push(this);
DBG(("DocHtmlRow::parseXml() start\n"));
bool isFirst=TRUE;
DocHtmlCell *cell=0;
// get next token
int tok=doctokenizerYYlex();
// skip whitespace
while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
// should find a html tag now
if (tok==TK_HTMLTAG)
{
int tagId=Mappers::htmlTagMapper->map(g_token->name);
if (tagId==XML_TERM && !g_token->endTag) // found <term> tag
{
}
else if (tagId==XML_DESCRIPTION && !g_token->endTag) // found <description> tag
{
}
else // found some other tag
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected <term> or <description> tag but "
"found <%s> instead!",g_token->name.data());
doctokenizerYYpushBackHtmlTag(g_token->name);
goto endrow;
}
}
else if (tok==0) // premature end of comment
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected end of comment while looking"
" for a html description title");
goto endrow;
}
else // token other than html token
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected <td> or <th> tag but found %s token instead!",
tokToString(tok));
goto endrow;
}
do
{
cell=new DocHtmlCell(this,g_token->attribs,isHeading);
cell->markFirst(isFirst);
isFirst=FALSE;
m_children.append(cell);
retval=cell->parseXml();
}
while (retval==RetVal_TableCell || retval==RetVal_TableHCell);
if (cell) cell->markLast(TRUE);
endrow:
DBG(("DocHtmlRow::parseXml() end\n"));
DocNode *n=g_nodeStack.pop();
ASSERT(n==this);
return retval;
}
//---------------------------------------------------------------------------
int DocHtmlTable::parse()
......@@ -2958,6 +3069,48 @@ getrow:
return retval==RetVal_EndTable ? RetVal_OK : retval;
}
int DocHtmlTable::parseXml()
{
int retval=RetVal_OK;
g_nodeStack.push(this);
DBG(("DocHtmlTable::parseXml() start\n"));
// get next token
int tok=doctokenizerYYlex();
// skip whitespace
while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
// should find a html tag now
int tagId=0;
bool isHeader=FALSE;
if (tok==TK_HTMLTAG)
{
tagId=Mappers::htmlTagMapper->map(g_token->name);
if (tagId==XML_ITEM && !g_token->endTag) // found <item> tag
{
retval=RetVal_TableRow;
}
if (tagId==XML_LISTHEADER && !g_token->endTag) // found <listheader> tag
{
retval=RetVal_TableRow;
isHeader=TRUE;
}
}
// parse one or more rows
while (retval==RetVal_TableRow)
{
DocHtmlRow *tr=new DocHtmlRow(this,g_token->attribs);
m_children.append(tr);
retval=tr->parseXml(isHeader);
isHeader=FALSE;
}
DBG(("DocHtmlTable::parseXml() end\n"));
DocNode *n=g_nodeStack.pop();
ASSERT(n==this);
return retval==RetVal_EndTable ? RetVal_OK : retval;
}
uint DocHtmlTable::numCols() const
{
uint cols=0;
......@@ -4788,6 +4941,10 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
break;
case XML_EXAMPLE:
case XML_DESCRIPTION:
if (insideTable(this))
{
retval=RetVal_TableCell;
}
break;
case XML_C:
handleStyleEnter(this,m_children,DocStyleChange::Code,&g_token->attribs);
......@@ -4836,19 +4993,31 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
}
break;
case XML_ITEM:
if (!insideUL(this) && !insideOL(this))
case XML_LISTHEADER:
if (insideTable(this))
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: lonely <item> tag found");
retval=RetVal_TableRow;
}
else
else if (insideUL(this) || insideOL(this))
{
retval=RetVal_ListItem;
}
else
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: lonely <item> tag found");
}
break;
case XML_RETURNS:
retval = handleSimpleSection(DocSimpleSect::Return,TRUE);
g_hasReturnCommand=TRUE;
break;
case XML_TERM:
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Bold,TRUE));
if (insideTable(this))
{
retval=RetVal_TableCell;
}
break;
case XML_SEE:
// I'm not sure if <see> is the same as <seealso> or if it
// should you link a member without producing a section. The
......@@ -4923,15 +5092,26 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
case XML_LIST:
{
QString type;
findAttribute(tagHtmlAttribs,"type",&type);
DocHtmlList::Type listType = DocHtmlList::Unordered;
if (findAttribute(tagHtmlAttribs,"type",&type) && type=="number")
if (type=="number")
{
listType=DocHtmlList::Ordered;
}
DocHtmlList *list = new DocHtmlList(this,tagHtmlAttribs,listType);
if (type=="table")
{
DocHtmlTable *table = new DocHtmlTable(this,tagHtmlAttribs);
m_children.append(table);
retval=table->parseXml();
}
else
{
HtmlAttribList emptyList;
DocHtmlList *list = new DocHtmlList(this,emptyList,listType);
m_children.append(list);
retval=list->parseXml();
}
}
break;
case XML_INCLUDE:
case XML_PERMISSION:
......@@ -5078,6 +5258,9 @@ int DocPara::handleHtmlEndTag(const QString &tagName)
// ignore </a> tag (can be part of <a name=...></a>
break;
case XML_TERM:
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Bold,FALSE));
break;
case XML_SUMMARY:
case XML_REMARKS:
case XML_PARA:
......@@ -5094,6 +5277,7 @@ int DocPara::handleHtmlEndTag(const QString &tagName)
handleStyleLeave(this,m_children,DocStyleChange::Code,"c");
break;
case XML_ITEM:
case XML_LISTHEADER:
case XML_INCLUDE:
case XML_PERMISSION:
case XML_DESCRIPTION:
......
......@@ -1140,6 +1140,7 @@ class DocHtmlCell : public CompAccept<DocHtmlCell>, public DocNode
void markLast(bool v=TRUE) { m_isLast=v; }
const HtmlAttribList &attribs() const { return m_attribs; }
int parse();
int parseXml();
private:
DocNode * m_parent;
......@@ -1179,6 +1180,7 @@ class DocHtmlRow : public CompAccept<DocHtmlRow>, public DocNode
void accept(DocVisitor *v) { CompAccept<DocHtmlRow>::accept(this,v); }
const HtmlAttribList &attribs() const { return m_attribs; }
int parse();
int parseXml(bool header);
private:
DocNode * m_parent;
......@@ -1199,6 +1201,7 @@ class DocHtmlTable : public CompAccept<DocHtmlTable>, public DocNode
bool hasCaption() { return m_caption!=0; }
const HtmlAttribList &attribs() const { return m_attribs; }
int parse();
int parseXml();
uint numCols() const;
void accept(DocVisitor *v);
......
This diff is collapsed.
......@@ -82,6 +82,7 @@ class DotNode
int number() const { return m_number; }
bool isVisible() const { return m_visible; }
TruncState isTruncated() const { return m_truncated; }
int distance() const { return m_distance; }
private:
void colorConnectedNodes(int curColor);
......@@ -89,6 +90,7 @@ class DotNode
bool hasNonReachableChildren, bool reNumber=FALSE);
void writeArrow(QTextStream &t,GraphType gt,GraphOutputFormat f,DotNode *cn,
EdgeInfo *ei,bool topDown, bool pointBack=TRUE, bool reNumber=FALSE);
void setDistance(int distance);
const DotNode *findDocNode() const; // only works for acyclic graphs!
void markAsVisible(bool b=TRUE) { m_visible=b; }
void markAsTruncated(bool b=TRUE) { m_truncated=b ? Truncated : Untruncated; }
......@@ -106,6 +108,7 @@ class DotNode
ClassDef * m_classDef; //!< class representing this node (can be 0)
bool m_visible; //!< is the node visible in the output
TruncState m_truncated; //!< does the node have non-visible children/parents
int m_distance; //!< shortest path to the root node
friend class DotGfxHierarchyTable;
friend class DotClassGraph;
......@@ -155,6 +158,7 @@ class DotClassGraph
DotClassGraph(ClassDef *cd,DotNode::GraphType t);
~DotClassGraph();
bool isTrivial() const;
bool isTooBig() const;
QCString writeGraph(QTextStream &t,GraphOutputFormat f,const char *path,
const char *relPath, bool TBRank=TRUE,bool imageMap=TRUE);
......@@ -163,12 +167,12 @@ class DotClassGraph
QCString diskName() const;
private:
void buildGraph(ClassDef *cd,DotNode *n,bool base);
void buildGraph(ClassDef *cd,DotNode *n,bool base,int distance);
void determineVisibleNodes(QList<DotNode> &queue,int &maxNodes,bool includeParents);
void determineTruncatedNodes(QList<DotNode> &queue,bool includeParents);
void addClass(ClassDef *cd,DotNode *n,int prot,const char *label,
const char *usedName,const char *templSpec,
bool base);
bool base,int distance);
DotNode * m_startNode;
QDict<DotNode> * m_usedNodes;
......@@ -187,11 +191,12 @@ class DotInclDepGraph
const char *relPath,
bool writeImageMap=TRUE);
bool isTrivial() const;
bool isTooBig() const;
QCString diskName() const;
void writeXML(QTextStream &t);
private:
void buildGraph(DotNode *n,FileDef *fd);
void buildGraph(DotNode *n,FileDef *fd,int distance);
void determineVisibleNodes(QList<DotNode> &queue,int &maxNodes);
void determineTruncatedNodes(QList<DotNode> &queue);
......@@ -213,6 +218,7 @@ class DotCallGraph
const char *path,const char *relPath,bool writeImageMap=TRUE);
void buildGraph(DotNode *n,MemberDef *md);
bool isTrivial() const;
bool isTooBig() const;
void determineVisibleNodes(QList<DotNode> &queue, int &maxNodes);
void determineTruncatedNodes(QList<DotNode> &queue);
......
......@@ -6397,7 +6397,7 @@ static void addEnumValuesToEnums(EntryNav *rootNav)
// must create them here
e->loadEntry(g_storage);
MemberDef *fmd = addVariableToFile(e,MemberDef::EnumValue,
md->getOuterScope() ? md->getOuterScope()->name() : "",
md->getOuterScope() ? md->getOuterScope()->name() : QCString(),
e->name(),TRUE,0);
md->insertEnumField(fmd);
fmd->setEnumScope(md);
......@@ -6659,6 +6659,43 @@ static void findDocumentedEnumValues()
findDEV(*Doxygen::functionNameSDict);
}
//----------------------------------------------------------------------
static void addMembersToIndex()
{
MemberName *mn;
MemberNameSDict::Iterator mnli(*Doxygen::memberNameSDict);
// for each member name
for (mnli.toFirst();(mn=mnli.current());++mnli)
{
MemberDef *md;
MemberNameIterator mni(*mn);
// for each member definition
for (mni.toFirst();(md=mni.current());++mni)
{
addClassMemberNameToIndex(md);
}
}
MemberNameSDict::Iterator fnli(*Doxygen::functionNameSDict);
// for each member name
for (fnli.toFirst();(mn=fnli.current());++fnli)
{
MemberDef *md;
MemberNameIterator mni(*mn);
// for each member definition
for (mni.toFirst();(md=mni.current());++mni)
{
if (md->getNamespaceDef())
{
addNamespaceMemberNameToIndex(md);
}
else
{
addFileMemberNameToIndex(md);
}
}
}
}
//----------------------------------------------------------------------
// computes the relation between all members. For each member `m'
......@@ -8560,49 +8597,13 @@ void readFormulaRepository()
//----------------------------------------------------------------------------
static QDict<void> aliasesProcessed;
static QCString expandAliasesRec(const QCString s)
{
QCString result;
static QRegExp cmdPat("[\\\\@][a-z_A-Z][a-z_A-Z0-9]*");
QCString value=s;
int i,p=0,l;
while ((i=cmdPat.match(value,p,&l))!=-1)
{
result+=value.mid(p,i-p);
QCString cmd=value.mid(i+1,l-1);
//printf("Found command '%s'\n",cmd.data());
QCString *aliasText=Doxygen::aliasDict.find(cmd);
if (aliasesProcessed.find(cmd)==0 && aliasText) // expand the alias
{
aliasesProcessed.insert(cmd,(void *)0x8);
result+=expandAliasesRec(*aliasText);
aliasesProcessed.remove(cmd);
}
else // command is not an alias
{
result+=value.mid(i,l);
}
p=i+l;
}
result+=value.right(value.length()-p);
//printf("expandAliases '%s'->'%s'\n",s.data(),result.data());
return result;
}
static void expandAliases()
{
QDictIterator<QCString> adi(Doxygen::aliasDict);
QCString *s;
for (adi.toFirst();(s=adi.current());++adi)
{
aliasesProcessed.clear();
// avoid expanding this command recursively
aliasesProcessed.insert(adi.currentKey(),(void *)0x8);
// expand embedded commands
*s = expandAliasesRec(*s);
*s = expandAlias(adi.currentKey(),*s);
}
}
......@@ -8678,7 +8679,6 @@ void readAliases()
}
expandAliases();
escapeAliases();
aliasesProcessed.clear();
}
//----------------------------------------------------------------------------
......@@ -9880,6 +9880,7 @@ void generateOutput()
writeGroupIndex(*outputList);
msg("Generating class documentation...\n");
addMembersToIndex();
generateClassDocs();
if (Config_getBool("HAVE_DOT") && Config_getBool("GRAPHICAL_HIERARCHY"))
......@@ -9979,7 +9980,7 @@ void generateOutput()
QDir::setCurrent(Config_getString("HTML_OUTPUT"));
if (portable_system(Config_getString("HHC_LOCATION"), "index.hhp", FALSE))
{
err("Error: failed to run html help compiler on index.hhp");
err("Error: failed to run html help compiler on index.hhp\n");
}
QDir::setCurrent(oldDir);
}
......
......@@ -391,7 +391,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
//printf("Graph for file %s\n",name().data());
DotInclDepGraph incDepGraph(this,FALSE);
if (!incDepGraph.isTrivial())
if (!incDepGraph.isTrivial() && !incDepGraph.isTooBig())
{
ol.startTextBlock();
ol.disable(OutputGenerator::Man);
......@@ -409,7 +409,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
//printf("Graph for file %s\n",name().data());
DotInclDepGraph incDepGraph(this,TRUE);
if (!incDepGraph.isTrivial())
if (!incDepGraph.isTrivial() && !incDepGraph.isTooBig())
{
ol.startTextBlock();
ol.disable(OutputGenerator::Man);
......@@ -723,7 +723,7 @@ void FileDef::insertMember(MemberDef *md)
m_memberLists.append(allMemberList);
}
allMemberList->append(md);
::addFileMemberNameToIndex(md);
//::addFileMemberNameToIndex(md);
switch (md->memberType())
{
case MemberDef::Variable:
......
......@@ -577,18 +577,26 @@ void HtmlDocVisitor::visitPre(DocHtmlList *s)
{
if (m_hide) return;
if (s->type()==DocHtmlList::Ordered)
{
m_t << "<ol" << htmlAttribsToString(s->attribs()) << ">\n";
}
else
{
m_t << "<ul" << htmlAttribsToString(s->attribs()) << ">\n";
}
}
void HtmlDocVisitor::visitPost(DocHtmlList *s)
{
if (m_hide) return;
if (s->type()==DocHtmlList::Ordered)
{
m_t << "</ol>";
}
else
{
m_t << "</ul>";
}
if (!s->isPreformatted()) m_t << "\n";
}
......
......@@ -873,7 +873,7 @@ void HtmlGenerator::writeCodeLink(const char *ref,const char *f,
if (f) t << f << Doxygen::htmlFileExtension;
if (anchor) t << "#" << anchor;
t << "\"";
if (tooltip) t << " title=\"" << tooltip << "\"";
if (tooltip) t << " title=\"" << convertToXML(tooltip) << "\"";
t << ">";
docify(name);
t << "</a>";
......
......@@ -1667,7 +1667,8 @@ void initClassMemberIndices()
void addClassMemberNameToIndex(MemberDef *md)
{
static bool hideFriendCompounds = Config_getBool("HIDE_FRIEND_COMPOUNDS");
ClassDef *cd;
ClassDef *cd=0;
if (md->isLinkableInProject() &&
(cd=md->getClassDef()) &&
cd->isLinkableInProject() &&
......
......@@ -237,21 +237,22 @@ static void writeDefaultHeaderPart1(QTextStream &t)
}
if (Config_getBool("PDF_HYPERLINKS"))
{
t << "\\ifx\\pdfoutput\\undefined" << endl
<< "\\usepackage[ps2pdf," << endl
t << "\\usepackage{ifpdf}" << endl
<< "\\ifpdf" << endl
<< "\\usepackage[pdftex," << endl
<< " pagebackref=true," << endl
<< " colorlinks=true," << endl
<< " linkcolor=blue," << endl
<< " unicode" << endl
<< " ]{hyperref}" << endl
<< "\\usepackage{pspicture}" << endl
<< "\\else" << endl
<< "\\usepackage[pdftex," << endl
<< "\\usepackage[ps2pdf," << endl
<< " pagebackref=true," << endl
<< " colorlinks=true," << endl
<< " linkcolor=blue," << endl
<< " unicode" << endl
<< " ]{hyperref}" << endl
<< "\\usepackage{pspicture}" << endl
<< "\\fi" << endl;
}
// Try to get the command for switching on the language
......
......@@ -772,10 +772,15 @@ bool MemberDef::isLinkableInProject() const
static bool extractStatic = Config_getBool("EXTRACT_STATIC");
makeResident();
if (isHidden()) return FALSE;
//printf("MemberDef::isLinkableInProject(name=%s)\n",name().data());
if (isHidden())
{
//printf("is hidden\n");
return FALSE;
}
if (m_impl->templateMaster)
{
//printf("has template master\n");
return m_impl->templateMaster->isLinkableInProject();
}
if (name().isEmpty() || name().at(0)=='@')
......@@ -2157,7 +2162,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
)
{
DotCallGraph callGraph(this,FALSE);
if (!callGraph.isTrivial())
if (!callGraph.isTrivial() && !callGraph.isTooBig())
{
msg("Generating call graph for function %s\n",qualifiedName().data());
ol.disable(OutputGenerator::Man);
......@@ -2172,8 +2177,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
&& isFunction() && Config_getBool("HAVE_DOT")
)
{
DotCallGraph callerGraph(this, true);
if (!callerGraph.isTrivial())
DotCallGraph callerGraph(this, TRUE);
if (!callerGraph.isTrivial() && !callerGraph.isTooBig())
{
msg("Generating caller graph for function %s\n",qualifiedName().data());
ol.disable(OutputGenerator::Man);
......
......@@ -98,7 +98,7 @@ void writeMscGraphFromFile(const char *inFile,const char *outDir,
// go to the html output directory (i.e. path)
QDir::setCurrent(outDir);
//printf("Going to dir %s\n",QDir::currentDirPath().data());
QCString mscExe = Config_getString("MSC_PATH")+"mscgen"+portable_commandExtension();
QCString mscExe = Config_getString("MSCGEN_PATH")+"mscgen"+portable_commandExtension();
QCString mscArgs;
QCString extension;
if (format==MSC_BITMAP)
......@@ -151,7 +151,7 @@ QString getMscImageMapFromFile(const QString& inFile, const QString& outDir,
QCString mscExe = "mscgen";
QCString mscArgs = "-T ismap -i \"";
mscArgs+=inFile + ".msc\" -o \"";
mscArgs+=outFile + ".map\"";
mscArgs+=outFile + "\"";
int exitCode;
if ((exitCode=portable_system(mscExe,mscArgs,FALSE))!=0)
......@@ -162,7 +162,7 @@ QString getMscImageMapFromFile(const QString& inFile, const QString& outDir,
QString result;
QTextOStream tmpout(&result);
convertMapFile(tmpout, outFile+".map", relPath);
convertMapFile(tmpout, outFile, relPath);
QDir().remove(outFile);
QDir::setCurrent(oldDir);
......
......@@ -179,7 +179,7 @@ void NamespaceDef::insertMember(MemberDef *md)
m_memberLists.append(allMemberList);
}
allMemberList->append(md);
::addNamespaceMemberNameToIndex(md);
//::addNamespaceMemberNameToIndex(md);
//static bool sortBriefDocs=Config_getBool("SORT_BRIEF_DOCS");
switch(md->memberType())
{
......
......@@ -620,7 +620,8 @@ class TranslatorChinese : public Translator
*/
virtual QCString trNamespaces()
{
return "Namespaces";
// return "Namespaces";
return "名字空间";
}
//////////////////////////////////////////////////////////////////////////
......
......@@ -116,8 +116,9 @@ void TextGeneratorOLImpl::writeLink(const char *extRef,const char *file,
// an inheritance tree of depth of 100000 should be enough for everyone :-)
const int maxInheritanceDepth = 100000;
bool isId(char c)
bool isId(int c)
{
if (c<0 || c>255) return FALSE;
return c=='_' || isalnum(c);
}
......@@ -6080,3 +6081,166 @@ QCString parseCommentAsText(const QString &doc,const QCString &fileName,int line
return result.data();
}
//--------------------------------------------------------------------------------------
static QDict<void> aliasesProcessed;
QCString expandAliasRec(const QCString s)
{
QCString result;
static QRegExp cmdPat("[\\\\@][a-z_A-Z][a-z_A-Z0-9]*");
QCString value=s;
int i,p=0,l;
while ((i=cmdPat.match(value,p,&l))!=-1)
{
result+=value.mid(p,i-p);
QCString args = extractAliasArgs(value,i+l);
bool hasArgs = !args.isEmpty(); // found directly after command
QCString cmd;
if (hasArgs)
{
int numArgs = countAliasArguments(args);
cmd = value.mid(i+1,l-1)+QCString().sprintf("{%d}",numArgs); // alias name + {n}
}
else
{
cmd = value.mid(i+1,l-1);
}
//printf("Found command '%s' args='%s'\n",cmd.data(),args.data());
QCString *aliasText=Doxygen::aliasDict.find(cmd);
if (aliasesProcessed.find(cmd)==0 && aliasText) // expand the alias
{
//printf("is an alias!\n");
aliasesProcessed.insert(cmd,(void *)0x8);
QCString val = *aliasText;
if (hasArgs)
{
val = replaceAliasArguments(val,args);
//printf("replace '%s'->'%s' args='%s'\n",
// aliasText->data(),val.data(),args.data());
}
result+=expandAliasRec(val);
aliasesProcessed.remove(cmd);
p=i+l;
if (hasArgs) p+=args.length()+2;
}
else // command is not an alias
{
//printf("not an alias!\n");
result+=value.mid(i,l);
p=i+l;
}
}
result+=value.right(value.length()-p);
//printf("expandAliases '%s'->'%s'\n",s.data(),result.data());
return result;
}
static QCString replaceAliasArgument(const QCString &aliasValue,int paramNum,
const QCString &paramValue)
{
QCString result = aliasValue;
QCString paramMarker;
paramMarker.sprintf("\\%d",paramNum);
int markerLen = paramMarker.length();
int p=0,i;
while ((i=aliasValue.find(paramMarker,p))!=-1) // search for marker
{
//printf("Found marker '%s' at %d len=%d for param '%s' in '%s'\n",
// paramMarker.data(),i,markerLen,paramValue.data(),aliasValue.data());
if (i==0 || aliasValue.at(i-1)!='\\') // found unescaped marker
{
QCString before = result.left(i);
QCString after = result.mid(i+markerLen);
result = before + paramValue + after;
p=i+paramValue.length();
}
else // ignore escaped markers
{
p=i+1;
}
}
result = expandAliasRec(substitute(result,"\\,",","));
//printf("replaceAliasArgument('%s',%d,'%s')->%s\n",
// aliasValue.data(),paramNum,paramValue.data(),result.data());
return result;
}
QCString replaceAliasArguments(const QCString &aliasValue,const QCString &argList)
{
QCString result = aliasValue;
QList<QCString> args;
int p=0,i,c=1;
for (i=0;i<(int)argList.length();i++)
{
if (argList.at(i)==',' && (i==0 || argList.at(i-1)!='\\'))
{
result = replaceAliasArgument(result,c,argList.mid(p,i-p));
p=i+1;
c++;
}
}
if (p<(int)argList.length())
{
result = replaceAliasArgument(result,c,argList.right(argList.length()-p));
}
return result;
}
int countAliasArguments(const QCString argList)
{
int count=1;
int l = argList.length();
int i;
for (i=0;i<l;i++)
{
if (argList.at(i)==',' && (i==0 || argList.at(i-1)!='\\')) count++;
}
return count;
}
QCString extractAliasArgs(const QCString &args,int pos)
{
int i;
int bc=0;
if (args.at(pos)=='{') // alias has argument
{
for (i=pos;i<(int)args.length();i++)
{
if (args.at(i)=='{') bc++;
if (args.at(i)=='}') bc--;
if (bc==0)
{
//printf("extractAliasArgs('%s')->'%s'\n",args.data(),args.mid(pos+1,i-pos-1).data());
return args.mid(pos+1,i-pos-1);
}
}
}
return "";
}
QCString resolveAliasCmd(const QCString aliasCmd)
{
QCString result;
aliasesProcessed.clear();
//printf("Expanding: '%s'\n",aliasCmd.data());
result = expandAliasRec(aliasCmd);
//printf("Expanding result: '%s'->'%s'\n",aliasCmd.data(),result.data());
return result;
}
QCString expandAlias(const QCString &aliasName,const QCString &aliasValue)
{
QCString result;
aliasesProcessed.clear();
// avoid expanding this command recursively
aliasesProcessed.insert(aliasName,(void *)0x8);
// expand embedded commands
//printf("Expanding: '%s'->'%s'\n",aliasName.data(),aliasValue.data());
result = expandAliasRec(aliasValue);
//printf("Expanding result: '%s'->'%s'\n",aliasName.data(),result.data());
return result;
}
......@@ -187,7 +187,7 @@ QCString showFileDefMatches(const FileNameDict *fnDict,const char *n);
int guessSection(const char *name);
bool isId(char c);
bool isId(int c);
QCString removeRedundantWhiteSpace(const QCString &s);
......@@ -334,5 +334,14 @@ QCString transcodeCharacterStringToUTF8(const QCString &input);
QCString recodeString(const QCString &str,const char *fromEncoding,const char *toEncoding);
QCString extractAliasArgs(const QCString &args,int pos);
int countAliasArguments(const QCString argList);
QCString replaceAliasArguments(const QCString &aliasValue,const QCString &argList);
QCString resolveAliasCmd(const QCString aliasCmd);
QCString expandAlias(const QCString &aliasName,const QCString &aliasValue);
#endif
......@@ -189,7 +189,7 @@ void writeXMLLink(QTextStream &t,const char *extRef,const char *compoundId,
if (anchorId) t << "member"; else t << "compound";
t << "\"";
if (extRef) t << " external=\"" << extRef << "\"";
if (tooltip) t << " tooltip=\"" << tooltip << "\"";
if (tooltip) t << " tooltip=\"" << convertToXML(tooltip) << "\"";
t << ">";
writeXMLString(t,text);
t << "</ref>";
......
......@@ -43,7 +43,7 @@ TMAKE_LFLAGS_SHAPP = -shared
TMAKE_LFLAGS_SHLIB = -shared -h $(TARGET1)
TMAKE_LFLAGS_SONAME =
TMAKE_LIBS =
TMAKE_LIBS = -liconv
TMAKE_LIBS_X11 = -lXext -lX11 -lm
TMAKE_LIBS_QT = -lqt
TMAKE_LIBS_QT_MT = -lqt-mt
......
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