Commit 97a3911e authored by dimitri's avatar dimitri

Release-1.5.1-20070315

parent f7f03d94
DOXYGEN Version 1.5.1-20070219 DOXYGEN Version 1.5.1-20070315
Please read the installation section of the manual Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions. (http://www.doxygen.org/install.html) for instructions.
-------- --------
Dimitri van Heesch (19 February 2007) Dimitri van Heesch (15 March 2007)
DOXYGEN Version 1.5.1_20070219 DOXYGEN Version 1.5.1_20070315
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. ...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy, Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (19 February 2007) Dimitri van Heesch (dimitri@stack.nl) (15 March 2007)
...@@ -40,7 +40,7 @@ class XRefDummyCodeGenerator : public CodeOutputInterface ...@@ -40,7 +40,7 @@ class XRefDummyCodeGenerator : public CodeOutputInterface
// these are just null functions, they can be used to produce a syntax highlighted // these are just null functions, they can be used to produce a syntax highlighted
// and cross-linked version of the source code, but who needs that anyway ;-) // and cross-linked version of the source code, but who needs that anyway ;-)
void codify(const char *) {} void codify(const char *) {}
void writeCodeLink(const char *,const char *,const char *,const char *) {} void writeCodeLink(const char *,const char *,const char *,const char *,const char *) {}
void startCodeLine() {} void startCodeLine() {}
void endCodeLine() {} void endCodeLine() {}
void startCodeAnchor(const char *) {} void startCodeAnchor(const char *) {}
......
...@@ -20,7 +20,7 @@ doxygen_version_minor=5 ...@@ -20,7 +20,7 @@ doxygen_version_minor=5
doxygen_version_revision=1 doxygen_version_revision=1
#NOTE: Setting version_mmn to "NO" will omit mmn info from the package. #NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
doxygen_version_mmn=20070219 doxygen_version_mmn=20070315
bin_dirs=`echo $PATH | sed -e "s/:/ /g"` bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
......
...@@ -74,6 +74,7 @@ documentation: ...@@ -74,6 +74,7 @@ documentation:
\refitem cmdendlatexonly \\endlatexonly \refitem cmdendlatexonly \\endlatexonly
\refitem cmdendlink \\endlink \refitem cmdendlink \\endlink
\refitem cmdendmanonly \\endmanonly \refitem cmdendmanonly \\endmanonly
\refitem cmdendmsc \\endmsc
\refitem cmdendverbatim \\endverbatim \refitem cmdendverbatim \\endverbatim
\refitem cmdendxmlonly \\endxmlonly \refitem cmdendxmlonly \\endxmlonly
\refitem cmdenum \\enum \refitem cmdenum \\enum
...@@ -102,6 +103,7 @@ documentation: ...@@ -102,6 +103,7 @@ documentation:
\refitem cmdlink \\link \refitem cmdlink \\link
\refitem cmdmainpage \\mainpage \refitem cmdmainpage \\mainpage
\refitem cmdmanonly \\manonly \refitem cmdmanonly \\manonly
\refitem cmdmsc \\msc
\refitem cmdn \\n \refitem cmdn \\n
\refitem cmdname \\name \refitem cmdname \\name
\refitem cmdnamespace \\namespace \refitem cmdnamespace \\namespace
...@@ -1778,6 +1780,53 @@ class C {}; ...@@ -1778,6 +1780,53 @@ class C {};
*/ */
\endcode \endcode
<hr>
\section cmdmsc \\msc
\addindex \\msc
Starts a text fragment which should contain a valid description of a
message sequence chart. See http://www.mcternan.me.uk/mscgen/ for examples.
The text fragment ends with \ref cmdendmsc "\\endmsc".
\note The text fragment should only include the part of the message
sequence chart that is
within the <code>msc {...}</code> block.
\note You need to install the <code>mscgen</code> tool, if you want to use this
command.
Here is an example of the use of the \\msc command.
\code
/** Sender class. Can be used to send a command to the server.
* The receiver will acknowlegde the command by calling Ack().
* \msc
* Sender,Receiver;
* Sender->Receiver [label="Command()", URL="\ref Receiver::Command()"];
* Sender<-Receiver [label="Ack()", URL="\ref Ack()", ID="1"];
* \endmsc
*/
class Sender
{
public:
/** Acknowledgement from server */
void Ack(bool ok);
};
/** Receiver class. Can be used to receive and execute commands.
* After execution of a command, the receiver will send an acknowledgement
* \msc
* Receiver,Sender;
* Receiver<-Sender [label="Command()", URL="\ref Command()"];
* Receiver->Sender [label="Ack()", URL="\ref Sender::Ack()", ID="1"];
* \endmsc
*/
class Receiver
{
public:
/** Executable a command on the server */
void Command(int commandId);
};
\endcode
<hr> <hr>
\section cmddotfile \\dotfile <file> ["caption"] \section cmddotfile \\dotfile <file> ["caption"]
...@@ -1844,6 +1893,12 @@ class C {}; ...@@ -1844,6 +1893,12 @@ class C {};
\addindex \\enddot \addindex \\enddot
Ends a blocks that was started with \ref cmddot "\\dot". Ends a blocks that was started with \ref cmddot "\\dot".
<hr>
\section cmdendmsc \\endmsc
\addindex \\endmsc
Ends a blocks that was started with \ref cmdmsc "\\msc".
<hr> <hr>
\section cmdendhtmlonly \\endhtmlonly \section cmdendhtmlonly \\endhtmlonly
......
...@@ -163,6 +163,7 @@ followed by the descriptions of the tags grouped by category. ...@@ -163,6 +163,7 @@ followed by the descriptions of the tags grouped by category.
\refitem cfg_man_links MAN_LINKS \refitem cfg_man_links MAN_LINKS
\refitem cfg_man_output MAN_OUTPUT \refitem cfg_man_output MAN_OUTPUT
\refitem cfg_max_initializer_lines MAX_INITIALIZER_LINES \refitem cfg_max_initializer_lines MAX_INITIALIZER_LINES
\refitem cfg_mscgen_path MSCGEN_PATH
\refitem cfg_multiline_cpp_is_brief MULTILINE_CPP_IS_BRIEF \refitem cfg_multiline_cpp_is_brief MULTILINE_CPP_IS_BRIEF
\refitem cfg_optimize_output_for_c OPTIMIZE_OUTPUT_FOR_C \refitem cfg_optimize_output_for_c OPTIMIZE_OUTPUT_FOR_C
\refitem cfg_optimize_output_java OPTIMIZE_OUTPUT_JAVA \refitem cfg_optimize_output_java OPTIMIZE_OUTPUT_JAVA
...@@ -1635,6 +1636,15 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre> ...@@ -1635,6 +1636,15 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
This is only a fallback. It is recommended to install and use dot, This is only a fallback. It is recommended to install and use dot,
since it yields more powerful graphs. since it yields more powerful graphs.
\anchor cfg_mscgen_path
<dt>\c MSCGEN_PATH <dd>
\addindex MSCGEN_PATH
You can define message sequence charts within doxygen comments using the \ref cmdmsc "\\msc"
command. Doxygen will then run the <a href="http://www.mcternan.me.uk/mscgen/">msgen tool</a>) to
produce the chart and insert it in the documentation. The <code>MSCGEN_PATH</code> tag allows you to
specify the directory where the mscgen tool resides. If left empty the tool is assumed to
be found in the default search path.
\anchor cfg_have_dot \anchor cfg_have_dot
<dt>\c HAVE_DOT <dd> <dt>\c HAVE_DOT <dd>
\addindex HAVE_DOT \addindex HAVE_DOT
......
...@@ -237,39 +237,12 @@ various buffers and then run "texconfig init". ...@@ -237,39 +237,12 @@ various buffers and then run "texconfig init".
<li><b>Why are dependencies via STL classes not shown in the dot graphs?</b> <li><b>Why are dependencies via STL classes not shown in the dot graphs?</b>
Doxygen is unware of the STL classes, so it does not know that class A relates Doxygen is unware of the STL classes, unless the option BUILTIN_STL_SUPPORT is
to class B in the following example turned on.
\code <li><b>I have problems getting the search engine to work with PHP5 and/or windows</b>
#include <vector>
Please read <a href="searchengine.html">this</a> for hints on where to look.
using namespace std;
class B {};
class A
{
public:
vector<B> m_bvec;
};
\endcode
To overcome this problem you could provide the definition of the vector
class to doxygen (by including the file that defines it at the INPUT tag
in the config file). Since STL header files are often messy, a
(possibly) better approach is to include a dummy definition of a vector
class to the input. Here is an example of a dummy STL file for the vector
class:
\code
namespace std {
/*! STL vector class */
template<class T> class vector { public: T element; };
}
\endcode
I'm still looking for someone who can provide me with definitions
for all (relevant) STL classes.
<li><b>Can I configure doxygen from the command line?</b> <li><b>Can I configure doxygen from the command line?</b>
......
/****************************************************************************** /******************************************************************************
* Do not edit this file. It was generated by the translator.py script. * Do not edit this file. It was generated by the translator.py script.
* *
* Copyright (C) 1997-2007 by Dimitri van Heesch. * Copyright (C) 1997-2006 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other ...@@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other
than English (the default). The output language is chosen through the than English (the default). The output language is chosen through the
configuration file (with default name and known as Doxyfile). configuration file (with default name and known as Doxyfile).
Currently (version 1.5.1), 33 languages Currently (version 1.5.1-20070219), 33 languages
are supported (sorted alphabetically): are supported (sorted alphabetically):
Afrikaans, Arabic, Brazilian Portuguese, Catalan, Chinese, Chinese Afrikaans, Arabic, Brazilian Portuguese, Catalan, Chinese, Chinese
Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French, Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French,
......
(1.5.1) (1.5.1-20070219)
Doxygen supports the following 33 languages (sorted alphabetically): Doxygen supports the following 33 languages (sorted alphabetically):
......
...@@ -58,7 +58,7 @@ QCString::QCString( const char *str, uint maxlen ) ...@@ -58,7 +58,7 @@ QCString::QCString( const char *str, uint maxlen )
if (str && ( l = QMIN(qstrlen(str),maxlen) )) if (str && ( l = QMIN(qstrlen(str),maxlen) ))
{ {
m_data=(char *)malloc(l+1); m_data=(char *)malloc(l+1);
strncpy(m_data,str,maxlen); strncpy(m_data,str,l+1);
m_data[l]='\0'; m_data[l]='\0';
} }
else else
......
...@@ -50,6 +50,7 @@ ...@@ -50,6 +50,7 @@
#include <strings.h> #include <strings.h>
#endif #endif
class QGString; class QGString;
/***************************************************************************** /*****************************************************************************
......
...@@ -13,10 +13,17 @@ ...@@ -13,10 +13,17 @@
* *
*/ */
// with this switch you can choose between the original qcstring implementation,
// which implicitly shares data so copying is faster, but requires at least 12 bytes, and
// the new implementation in this file, which has a smaller footprint (only 4 bytes for
// an empty string), but always copies strings.
#define SMALLSTRING
#include "qcstring.h" #include "qcstring.h"
#ifndef SMALLSTRING #ifndef SMALLSTRING
#include "qcstring.cpp" #include "qcstring.cpp"
#else #else
#define SCString QCString
#include <qstring.h> #include <qstring.h>
#include <stdlib.h> #include <stdlib.h>
...@@ -60,7 +67,7 @@ SCString::SCString( const char *str, uint maxlen ) ...@@ -60,7 +67,7 @@ SCString::SCString( const char *str, uint maxlen )
if (str && ( l = QMIN(qstrlen(str),maxlen) )) if (str && ( l = QMIN(qstrlen(str),maxlen) ))
{ {
m_data=(char *)malloc(l+1); m_data=(char *)malloc(l+1);
strncpy(m_data,str,maxlen); strncpy(m_data,str,l+1);
m_data[l]='\0'; m_data[l]='\0';
} }
else else
......
...@@ -102,7 +102,9 @@ CommandMap cmdMap[] = ...@@ -102,7 +102,9 @@ CommandMap cmdMap[] =
{ "%", CMD_PERCENT }, { "%", CMD_PERCENT },
{ "_internalref", CMD_INTERNALREF }, { "_internalref", CMD_INTERNALREF },
{ "dot", CMD_DOT }, { "dot", CMD_DOT },
{ "msc", CMD_MSC },
{ "enddot", CMD_ENDDOT }, { "enddot", CMD_ENDDOT },
{ "endmsc", CMD_ENDMSC },
{ "manonly", CMD_MANONLY }, { "manonly", CMD_MANONLY },
{ "endmanonly", CMD_ENDMANONLY }, { "endmanonly", CMD_ENDMANONLY },
{ "includelineno", CMD_INCWITHLINES }, { "includelineno", CMD_INCWITHLINES },
......
...@@ -104,10 +104,12 @@ enum CommandType ...@@ -104,10 +104,12 @@ enum CommandType
CMD_XMLONLY = 70, CMD_XMLONLY = 70,
CMD_DOT = 71, CMD_DOT = 71,
CMD_ENDDOT = 72, CMD_ENDDOT = 72,
CMD_MANONLY = 73, CMD_MSC = 73,
CMD_ENDMANONLY = 74, CMD_ENDMSC = 74,
CMD_INCWITHLINES = 75, CMD_MANONLY = 75,
CMD_INHERITDOC = 76 CMD_ENDMANONLY = 76,
CMD_INCWITHLINES = 77,
CMD_INHERITDOC = 78
}; };
enum HtmlTagType enum HtmlTagType
......
...@@ -323,7 +323,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) ...@@ -323,7 +323,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
BEGIN(CComment); BEGIN(CComment);
} }
<CComment,ReadLine>[\\@]("dot"|"code")/[^a-z_A-Z0-9] { /* start of a verbatim block */ <CComment,ReadLine>[\\@]("dot"|"code"|"msc")/[^a-z_A-Z0-9] { /* start of a verbatim block */
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
g_lastCommentContext = YY_START; g_lastCommentContext = YY_START;
g_blockName=&yytext[1]; g_blockName=&yytext[1];
...@@ -352,7 +352,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) ...@@ -352,7 +352,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
<Scan>. { /* any other character */ <Scan>. { /* any other character */
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
} }
<Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}") { /* end of verbatim block */ <Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"f$"|"f]"|"f}") { /* end of verbatim block */
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
if (yytext[1]=='f') // end of formula if (yytext[1]=='f') // end of formula
{ {
...@@ -363,7 +363,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) ...@@ -363,7 +363,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
BEGIN(g_lastCommentContext); BEGIN(g_lastCommentContext);
} }
} }
<VerbatimCode>[\\@]("enddot"|"endcode") { /* end of verbatim block */ <VerbatimCode>[\\@]("enddot"|"endcode"|"endmsc") { /* end of verbatim block */
copyToOutput(yytext,yyleng); copyToOutput(yytext,yyleng);
if (&yytext[4]==g_blockName) if (&yytext[4]==g_blockName)
{ {
......
...@@ -170,6 +170,7 @@ static DocCmdMap docCmdMap[] = ...@@ -170,6 +170,7 @@ static DocCmdMap docCmdMap[] =
{ "rtfonly", &handleFormatBlock, FALSE }, { "rtfonly", &handleFormatBlock, FALSE },
{ "manonly", &handleFormatBlock, FALSE }, { "manonly", &handleFormatBlock, FALSE },
{ "dot", &handleFormatBlock, TRUE }, { "dot", &handleFormatBlock, TRUE },
{ "msc", &handleFormatBlock, TRUE },
{ "code", &handleFormatBlock, TRUE }, { "code", &handleFormatBlock, TRUE },
{ "addindex", &handleAddIndex, TRUE }, { "addindex", &handleAddIndex, TRUE },
{ "if", &handleIf, FALSE }, { "if", &handleIf, FALSE },
...@@ -742,7 +743,7 @@ static int yyread(char *buf,int max_size) ...@@ -742,7 +743,7 @@ static int yyread(char *buf,int max_size)
/* start command character */ /* start command character */
CMD ("\\"|"@") CMD ("\\"|"@")
DCMD1 ("arg"|"attention"|"author"|"code") DCMD1 ("arg"|"attention"|"author"|"code")
DCMD2 ("date"|"dot"|"dotfile"|"example") DCMD2 ("date"|"dot"|"msc"|"dotfile"|"example")
DCMD3 ("htmlinclude"|"htmlonly"|"image"|"include") DCMD3 ("htmlinclude"|"htmlonly"|"image"|"include")
DCMD4 ("includelineno"|"internal"|"invariant") DCMD4 ("includelineno"|"internal"|"invariant")
DCMD5 ("latexonly"|"li"|"line"|"manonly"|"name") DCMD5 ("latexonly"|"li"|"line"|"manonly"|"name")
...@@ -1488,7 +1489,7 @@ MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-] ...@@ -1488,7 +1489,7 @@ MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]
/* ----- handle arguments of the preformatted block commands ------- */ /* ----- handle arguments of the preformatted block commands ------- */
<FormatBlock>{CMD}("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode")/{NW} { // possible ends <FormatBlock>{CMD}("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"endmsc")/{NW} { // possible ends
addOutput(yytext); addOutput(yytext);
if (&yytext[4]==blockName) // found end of the block if (&yytext[4]==blockName) // found end of the block
{ {
......
...@@ -363,7 +363,7 @@ static QCString configStringRecode( ...@@ -363,7 +363,7 @@ static QCString configStringRecode(
{ {
outputSize-=oLeft; outputSize-=oLeft;
output.resize(outputSize+1); output.resize(outputSize+1);
output.at(outputSize+1)='\0'; output.at(outputSize)='\0';
//printf("iconv: input size=%d output size=%d\n[%s]\n",size,newSize,srcBuf.data()); //printf("iconv: input size=%d output size=%d\n[%s]\n",size,newSize,srcBuf.data());
} }
else else
...@@ -1089,21 +1089,7 @@ void Config::check() ...@@ -1089,21 +1089,7 @@ void Config::check()
QCString &dotPath = Config_getString("DOT_PATH"); QCString &dotPath = Config_getString("DOT_PATH");
if (!dotPath.isEmpty()) if (!dotPath.isEmpty())
{ {
if (dotPath.find('\\')!=-1) QFileInfo dp(dotPath+"/dot"+portable_commandExtension());
{
if (dotPath.at(dotPath.length()-1)!='\\')
{
dotPath+='\\';
}
}
else if (dotPath.find('/')!=-1)
{
if (dotPath.at(dotPath.length()-1)!='/')
{
dotPath+='/';
}
}
QFileInfo dp(dotPath+portable_dotCommand());
if (!dp.exists() || !dp.isFile()) if (!dp.exists() || !dp.isFile())
{ {
config_err("Warning: the dot tool could not be found at %s\n",dotPath.data()); config_err("Warning: the dot tool could not be found at %s\n",dotPath.data());
...@@ -1122,6 +1108,31 @@ void Config::check() ...@@ -1122,6 +1108,31 @@ void Config::check()
{ {
dotPath=""; dotPath="";
} }
// check mscgen path
QCString &mscgenPath = Config_getString("MSCGEN_PATH");
if (!mscgenPath.isEmpty())
{
QFileInfo dp(mscgenPath+"/mscgen"+portable_commandExtension());
if (!dp.exists() || !dp.isFile())
{
config_err("Warning: the mscgen tool could not be found at %s\n",mscgenPath.data());
mscgenPath="";
}
else
{
mscgenPath=dp.dirPath(TRUE)+"/";
#if defined(_WIN32) // convert slashes
uint i=0,l=mscgenPath.length();
for (i=0;i<l;i++) if (mscgenPath.at(i)=='/') mscgenPath.at(i)='\\';
#endif
}
}
else // make sure the string is empty but not null!
{
mscgenPath="";
}
// check input // check input
QStrList &inputSources=Config_getList("INPUT"); QStrList &inputSources=Config_getList("INPUT");
...@@ -1138,8 +1149,7 @@ void Config::check() ...@@ -1138,8 +1149,7 @@ void Config::check()
QFileInfo fi(s); QFileInfo fi(s);
if (!fi.exists()) if (!fi.exists())
{ {
config_err("Error: tag INPUT: input source `%s' does not exist\n",s); config_err("Warning: tag INPUT: input source `%s' does not exist\n",s);
exit(1);
} }
s=inputSources.next(); s=inputSources.next();
} }
...@@ -2711,6 +2721,13 @@ void Config::create() ...@@ -2711,6 +2721,13 @@ void Config::create()
"powerful graphs. \n", "powerful graphs. \n",
TRUE TRUE
); );
cs = addString( "MSCGEN_PATH",
"You can define message sequence charts within doxygen comments using the \\msc \n"
"command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to \n"
"produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to \n"
"specify the directory where the mscgen tool resides. If left empty the tool is assumed to \n"
"be found in the default search path. \n"
);
cb = addBool( cb = addBool(
"HIDE_UNDOC_RELATIONS", "HIDE_UNDOC_RELATIONS",
"If set to YES, the inheritance and collaboration graphs will hide \n" "If set to YES, the inheritance and collaboration graphs will hide \n"
......
...@@ -4392,6 +4392,15 @@ int DocPara::handleCommand(const QString &cmdName) ...@@ -4392,6 +4392,15 @@ int DocPara::handleCommand(const QString &cmdName)
doctokenizerYYsetStatePara(); doctokenizerYYsetStatePara();
} }
break; break;
case CMD_MSC:
{
doctokenizerYYsetStateMsc();
retval = doctokenizerYYlex();
m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Msc,g_isExample,g_exampleName));
if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: msc section ended without end marker");
doctokenizerYYsetStatePara();
}
break;
case CMD_ENDCODE: case CMD_ENDCODE:
case CMD_ENDHTMLONLY: case CMD_ENDHTMLONLY:
case CMD_ENDMANONLY: case CMD_ENDMANONLY:
...@@ -4402,6 +4411,9 @@ int DocPara::handleCommand(const QString &cmdName) ...@@ -4402,6 +4411,9 @@ int DocPara::handleCommand(const QString &cmdName)
case CMD_ENDDOT: case CMD_ENDDOT:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected command %s",g_token->name.data()); warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected command %s",g_token->name.data());
break; break;
case CMD_ENDMSC:
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected command %s",g_token->name.data());
break;
case CMD_PARAM: case CMD_PARAM:
retval = handleParamSection(cmdName,DocParamSect::Param,FALSE,g_token->paramDir); retval = handleParamSection(cmdName,DocParamSect::Param,FALSE,g_token->paramDir);
break; break;
......
...@@ -362,7 +362,7 @@ class DocWhiteSpace : public DocNode ...@@ -362,7 +362,7 @@ class DocWhiteSpace : public DocNode
class DocVerbatim : public DocNode class DocVerbatim : public DocNode
{ {
public: public:
enum Type { Code, HtmlOnly, ManOnly, LatexOnly, XmlOnly, Verbatim, Dot }; enum Type { Code, HtmlOnly, ManOnly, LatexOnly, XmlOnly, Verbatim, Dot, Msc };
DocVerbatim(DocNode *parent,const QString &context, DocVerbatim(DocNode *parent,const QString &context,
const QString &text, Type t,bool isExample, const QString &text, Type t,bool isExample,
const QString &exampleFile); const QString &exampleFile);
...@@ -374,7 +374,7 @@ class DocVerbatim : public DocNode ...@@ -374,7 +374,7 @@ class DocVerbatim : public DocNode
void accept(DocVisitor *v) { v->visit(this); } void accept(DocVisitor *v) { v->visit(this); }
bool isExample() const { return m_isExample; } bool isExample() const { return m_isExample; }
QString exampleFile() const { return m_exampleFile; } QString exampleFile() const { return m_exampleFile; }
QString relPath() const { return m_relPath; } QString relPath() const { return m_relPath; }
private: private:
DocNode *m_parent; DocNode *m_parent;
......
...@@ -133,6 +133,7 @@ void doctokenizerYYsetStateLatexOnly(); ...@@ -133,6 +133,7 @@ void doctokenizerYYsetStateLatexOnly();
void doctokenizerYYsetStateXmlOnly(); void doctokenizerYYsetStateXmlOnly();
void doctokenizerYYsetStateVerbatim(); void doctokenizerYYsetStateVerbatim();
void doctokenizerYYsetStateDot(); void doctokenizerYYsetStateDot();
void doctokenizerYYsetStateMsc();
void doctokenizerYYsetStateParam(); void doctokenizerYYsetStateParam();
void doctokenizerYYsetStateXRefItem(); void doctokenizerYYsetStateXRefItem();
void doctokenizerYYsetStateFile(); void doctokenizerYYsetStateFile();
......
...@@ -358,6 +358,7 @@ REFWORD ("#"|"::")?({ID}("."|"#"|"::"|"-"|"/"))*({ID}(":")?){FUNCARG}? ...@@ -358,6 +358,7 @@ REFWORD ("#"|"::")?({ID}("."|"#"|"::"|"-"|"/"))*({ID}(":")?){FUNCARG}?
%x St_XmlOnly %x St_XmlOnly
%x St_Verbatim %x St_Verbatim
%x St_Dot %x St_Dot
%x St_Msc
%x St_Param %x St_Param
%x St_XRefItem %x St_XRefItem
%x St_XRefItem2 %x St_XRefItem2
...@@ -602,17 +603,25 @@ REFWORD ("#"|"::")?({ID}("."|"#"|"::"|"-"|"/"))*({ID}(":")?){FUNCARG}? ...@@ -602,17 +603,25 @@ REFWORD ("#"|"::")?({ID}("."|"#"|"::"|"-"|"/"))*({ID}(":")?){FUNCARG}?
g_token->verb=stripEmptyLines(g_token->verb); g_token->verb=stripEmptyLines(g_token->verb);
return RetVal_OK; return RetVal_OK;
} }
<St_Verbatim>[^\\@\n]+ | <St_Verbatim>[^\\@\n]+ |
<St_Verbatim>\n | <St_Verbatim>\n |
<St_Verbatim>. { /* Verbatim text */ <St_Verbatim>. { /* Verbatim text */
g_token->verb+=yytext; g_token->verb+=yytext;
} }
<St_Dot>{CMD}"enddot" { <St_Dot>{CMD}"enddot" {
return RetVal_OK; return RetVal_OK;
} }
<St_Dot>[^\\@\n]+ | <St_Dot>[^\\@\n]+ |
<St_Dot>\n | <St_Dot>\n |
<St_Dot>. { /* dot text */ <St_Dot>. { /* dot text */
g_token->verb+=yytext;
}
<St_Msc>{CMD}"endmsc" {
return RetVal_OK;
}
<St_Msc>[^\\@\n]+ |
<St_Msc>\n |
<St_Msc>. { /* msc text */
g_token->verb+=yytext; g_token->verb+=yytext;
} }
<St_Title>"\"" { // quoted title <St_Title>"\"" { // quoted title
...@@ -844,6 +853,10 @@ REFWORD ("#"|"::")?({ID}("."|"#"|"::"|"-"|"/"))*({ID}(":")?){FUNCARG}? ...@@ -844,6 +853,10 @@ REFWORD ("#"|"::")?({ID}("."|"#"|"::"|"-"|"/"))*({ID}(":")?){FUNCARG}?
g_endMarker="enddot"; g_endMarker="enddot";
BEGIN(St_SecSkip); BEGIN(St_SecSkip);
} }
<St_Sections>{CMD}"msc"/[^a-z_A-Z0-9] {
g_endMarker="endmsc";
BEGIN(St_SecSkip);
}
<St_Sections>{CMD}"htmlonly"/[^a-z_A-Z0-9] { <St_Sections>{CMD}"htmlonly"/[^a-z_A-Z0-9] {
g_endMarker="endhtmlonly"; g_endMarker="endhtmlonly";
BEGIN(St_SecSkip); BEGIN(St_SecSkip);
...@@ -1006,6 +1019,12 @@ void doctokenizerYYsetStateDot() ...@@ -1006,6 +1019,12 @@ void doctokenizerYYsetStateDot()
BEGIN(St_Dot); BEGIN(St_Dot);
} }
void doctokenizerYYsetStateMsc()
{
g_token->verb="";
BEGIN(St_Msc);
}
void doctokenizerYYsetStateParam() void doctokenizerYYsetStateParam()
{ {
BEGIN(St_Param); BEGIN(St_Param);
......
...@@ -611,6 +611,9 @@ void FTVHelp::generateTreeView() ...@@ -611,6 +611,9 @@ void FTVHelp::generateTreeView()
t << "<frameset cols=\"" << Config_getInt("TREEVIEW_WIDTH") << ",*\">" << endl; t << "<frameset cols=\"" << Config_getInt("TREEVIEW_WIDTH") << ",*\">" << endl;
t << " <frame src=\"tree" << Doxygen::htmlFileExtension << "\" name=\"treefrm\">" << endl; t << " <frame src=\"tree" << Doxygen::htmlFileExtension << "\" name=\"treefrm\">" << endl;
t << " <frame src=\"main" << Doxygen::htmlFileExtension << "\" name=\"basefrm\">" << endl; t << " <frame src=\"main" << Doxygen::htmlFileExtension << "\" name=\"basefrm\">" << endl;
t << " <noframes>" << endl;
t << " <a href=\"main.html\">Frames are disabled. Click here to go to the main page.</a>" << endl;
t << " </noframes>" << endl;
t << "</frameset>" << endl; t << "</frameset>" << endl;
t << "</html>" << endl; t << "</html>" << endl;
f.close(); f.close();
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "config.h" #include "config.h"
#include "htmlgen.h" #include "htmlgen.h"
#include "parserintf.h" #include "parserintf.h"
#include "msc.h"
static const int NUM_HTML_LIST_TYPES = 4; static const int NUM_HTML_LIST_TYPES = 4;
...@@ -248,6 +249,33 @@ void HtmlDocVisitor::visit(DocVerbatim *s) ...@@ -248,6 +249,33 @@ void HtmlDocVisitor::visit(DocVerbatim *s)
if (Config_getBool("DOT_CLEANUP")) file.remove(); if (Config_getBool("DOT_CLEANUP")) file.remove();
} }
break; break;
case DocVerbatim::Msc:
{
static int mscindex = 1;
QCString baseName(4096);
baseName.sprintf("%s%d",
(Config_getString("HTML_OUTPUT")+"/inline_mscgraph_").data(),
mscindex++
);
QFile file(baseName+".msc");
if (!file.open(IO_WriteOnly))
{
err("Could not open file %s.msc for writing\n",baseName.data());
}
QCString text = "msc {";
text+=s->text();
text+="}";
file.writeBlock( text, text.length() );
file.close();
m_t << "<div align=\"center\">" << endl;
writeMscFile(baseName,s->relPath());
m_t << "</div>" << endl;
if (Config_getBool("DOT_CLEANUP")) file.remove();
}
break;
} }
} }
...@@ -1131,3 +1159,21 @@ void HtmlDocVisitor::writeDotFile(const QString &fileName,const QString &relPath ...@@ -1131,3 +1159,21 @@ void HtmlDocVisitor::writeDotFile(const QString &fileName,const QString &relPath
m_t << "<map name=\"" << mapName << "\">" << imap << "</map>" << endl; m_t << "<map name=\"" << mapName << "\">" << imap << "</map>" << endl;
} }
void HtmlDocVisitor::writeMscFile(const QString &fileName,const QString &relPath)
{
QString baseName=fileName;
int i;
if ((i=baseName.findRev('/'))!=-1)
{
baseName=baseName.right(baseName.length()-i-1);
}
QString outDir = Config_getString("HTML_OUTPUT");
writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP);
QString mapName = baseName+".map";
QString mapFile = fileName+".map";
m_t << "<img src=\"" << relPath << baseName << ".png\" alt=\""
<< baseName << "\" border=\"0\" usemap=\"#" << mapName << "\">" << endl;
QString imap = getMscImageMapFromFile(fileName,outDir,relPath.data());
m_t << "<map name=\"" << mapName << "\">" << imap << "</map>" << endl;
}
...@@ -136,6 +136,7 @@ class HtmlDocVisitor : public DocVisitor ...@@ -136,6 +136,7 @@ class HtmlDocVisitor : public DocVisitor
const QString &tooltip = QString::null); const QString &tooltip = QString::null);
void endLink(); void endLink();
void writeDotFile(const QString &fileName,const QString &relPath); void writeDotFile(const QString &fileName,const QString &relPath);
void writeMscFile(const QString &fileName,const QString &relPath);
void pushEnabled(); void pushEnabled();
void popEnabled(); void popEnabled();
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include "util.h" #include "util.h"
#include "message.h" #include "message.h"
#include "parserintf.h" #include "parserintf.h"
#include "msc.h"
static QString escapeLabelName(const char *s) static QString escapeLabelName(const char *s)
{ {
...@@ -302,6 +303,33 @@ void LatexDocVisitor::visit(DocVerbatim *s) ...@@ -302,6 +303,33 @@ void LatexDocVisitor::visit(DocVerbatim *s)
if (Config_getBool("DOT_CLEANUP")) file.remove(); if (Config_getBool("DOT_CLEANUP")) file.remove();
} }
break; break;
case DocVerbatim::Msc:
{
static int mscindex = 1;
QCString baseName(4096);
baseName.sprintf("%s%d",
(Config_getString("LATEX_OUTPUT")+"/inline_mscgraph_").data(),
mscindex++
);
QFile file(baseName+".msc");
if (!file.open(IO_WriteOnly))
{
err("Could not open file %s.msc for writing\n",baseName.data());
}
QCString text = "msc {";
text+=s->text();
text+="}";
file.writeBlock( text, text.length() );
file.close();
m_t << "\\begin{center}\n";
writeMscFile(baseName);
m_t << "\\end{center}\n";
if (Config_getBool("DOT_CLEANUP")) file.remove();
}
break;
} }
} }
...@@ -1141,3 +1169,23 @@ void LatexDocVisitor::endDotFile(bool hasCaption) ...@@ -1141,3 +1169,23 @@ void LatexDocVisitor::endDotFile(bool hasCaption)
} }
} }
void LatexDocVisitor::writeMscFile(const QString &baseName)
{
QString outDir = Config_getString("LATEX_OUTPUT");
writeMscGraphFromFile(baseName,outDir,baseName,MSC_EPS);
m_t << "\\begin{ImageNoCaption}\\mbox{";
m_t << "\\includegraphics";
//if (!width.isEmpty())
//{
// m_t << "[width=" << width << "]";
//}
//else if (!height.isEmpty())
//{
// m_t << "[height=" << height << "]";
//}
m_t << "{" << baseName << "}";
m_t << "}" << endl; // end mbox
m_t << "\\end{ImageNoCaption}" << endl;
}
...@@ -143,6 +143,7 @@ class LatexDocVisitor : public DocVisitor ...@@ -143,6 +143,7 @@ class LatexDocVisitor : public DocVisitor
void startDotFile(const QString &fileName,const QString &width, void startDotFile(const QString &fileName,const QString &width,
const QString &height, bool hasCaption); const QString &height, bool hasCaption);
void endDotFile(bool hasCaption); void endDotFile(bool hasCaption);
void writeMscFile(const QString &fileName);
void pushEnabled(); void pushEnabled();
void popEnabled(); void popEnabled();
......
...@@ -1142,13 +1142,12 @@ void LatexGenerator::startMemberDoc(const char *clname, ...@@ -1142,13 +1142,12 @@ void LatexGenerator::startMemberDoc(const char *clname,
t << "}" << endl; t << "}" << endl;
} }
if (Config_getBool("COMPACT_LATEX")) t << "\\paragraph"; else t << "\\subsubsection"; if (Config_getBool("COMPACT_LATEX")) t << "\\paragraph"; else t << "\\subsubsection";
if (Config_getBool("PDF_HYPERLINKS") && memname) //if (Config_getBool("PDF_HYPERLINKS") && memname)
{ //{
t << "["; // t << "[";
escapeMakeIndexChars(this,t,memname); // escapeMakeIndexChars(this,t,memname);
//filterTitle(title) // t << "]";
t << "]"; //}
}
t << "{\\setlength{\\rightskip}{0pt plus 5cm}"; t << "{\\setlength{\\rightskip}{0pt plus 5cm}";
} }
......
...@@ -70,6 +70,7 @@ HEADERS = bufstr.h \ ...@@ -70,6 +70,7 @@ HEADERS = bufstr.h \
memberlist.h \ memberlist.h \
membername.h \ membername.h \
message.h \ message.h \
msc.h \
namespacedef.h \ namespacedef.h \
objcache.h \ objcache.h \
outputgen.h \ outputgen.h \
...@@ -178,6 +179,7 @@ SOURCES = ce_lex.cpp \ ...@@ -178,6 +179,7 @@ SOURCES = ce_lex.cpp \
memberlist.cpp \ memberlist.cpp \
membername.cpp \ membername.cpp \
message.cpp \ message.cpp \
msc.cpp \
namespacedef.cpp \ namespacedef.cpp \
objcache.cpp \ objcache.cpp \
outputgen.cpp \ outputgen.cpp \
......
...@@ -219,6 +219,7 @@ void ManDocVisitor::visit(DocVerbatim *s) ...@@ -219,6 +219,7 @@ void ManDocVisitor::visit(DocVerbatim *s)
case DocVerbatim::XmlOnly: case DocVerbatim::XmlOnly:
case DocVerbatim::LatexOnly: case DocVerbatim::LatexOnly:
case DocVerbatim::Dot: case DocVerbatim::Dot:
case DocVerbatim::Msc:
/* nothing */ /* nothing */
break; break;
} }
......
...@@ -1549,7 +1549,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1549,7 +1549,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
QCString cfiname = container->getOutputFileBase(); QCString cfiname = container->getOutputFileBase();
static bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP"); static bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP");
HtmlHelp *htmlHelp = 0; HtmlHelp *htmlHelp = HtmlHelp::getInstance();
if (hasHtmlHelp) if (hasHtmlHelp)
{ {
if (isEnumerate() && name().at(0)=='@') if (isEnumerate() && name().at(0)=='@')
...@@ -1558,7 +1558,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1558,7 +1558,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
} }
else else
{ {
htmlHelp = HtmlHelp::getInstance();
htmlHelp->addIndexItem(ciname, // level1 htmlHelp->addIndexItem(ciname, // level1
name(), // level2 name(), // level2
separateMemPages ? cfname : cfiname, // contRef separateMemPages ? cfname : cfiname, // contRef
...@@ -1876,7 +1875,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1876,7 +1875,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
} }
/* write detailed description */ /* write detailed description */
if (!detailed.isEmpty()) if (!detailed.isEmpty() || !m_impl->inbodyDocs.isEmpty())
{ {
ol.parseDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,detailed+"\n",TRUE,FALSE); ol.parseDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,detailed+"\n",TRUE,FALSE);
if (!m_impl->inbodyDocs.isEmpty()) if (!m_impl->inbodyDocs.isEmpty())
......
/******************************************************************************
*
*
*
* Copyright (C) 1997-2007 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
* granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
* Documents produced by Doxygen are derivative works derived from the
* input used in their production; they are not affected by this license.
*
*/
#include "msc.h"
#include "portable.h"
#include "config.h"
#include "message.h"
#include "docparser.h"
#include "doxygen.h"
#include <qdir.h>
static const int maxCmdLine = 40960;
static bool convertMapFile(QTextStream &t,const char *mapName,const QCString relPath)
{
QFile f(mapName);
if (!f.open(IO_ReadOnly))
{
err("Error opening map file %s for inclusion in the docs!\n",mapName);
return FALSE;
}
const int maxLineLen=1024;
char buf[maxLineLen];
char url[maxLineLen];
char ref[maxLineLen];
int x1,y1,x2,y2;
while (!f.atEnd())
{
bool isRef = FALSE;
int numBytes = f.readLine(buf,maxLineLen);
buf[numBytes-1]='\0';
//printf("ReadLine `%s'\n",buf);
if (strncmp(buf,"rect",4)==0)
{
// obtain the url and the coordinates in the order used by graphviz-1.5
sscanf(buf,"rect %s %d,%d %d,%d",url,&x1,&y1,&x2,&y2);
if ( strcmp(url,"\\ref") == 0 )
{
isRef = TRUE;
sscanf(buf,"rect %s %s %d,%d %d,%d",ref,url,&x1,&y1,&x2,&y2);
}
// sanity checks
if (y2<y1) { int temp=y2; y2=y1; y1=temp; }
if (x2<x1) { int temp=x2; x2=x1; x1=temp; }
t << "<area href=\"";
if ( isRef )
{
// handle doxygen \ref tag URL reference
QCString *dest;
DocRef *df = new DocRef( (DocNode*) 0, url );
if (!df->ref().isEmpty())
{
if ((dest=Doxygen::tagDestinationDict[df->ref()])) t << *dest << "/";
}
if (!df->file().isEmpty()) t << relPath << df->file() << Doxygen::htmlFileExtension;
if (!df->anchor().isEmpty()) t << "#" << df->anchor();
}
else
{
t << url;
}
t << "\" shape=\"rect\" coords=\""
<< x1 << "," << y1 << "," << x2 << "," << y2 << "\""
<< " alt=\"\">" << endl;
}
}
return TRUE;
}
void writeMscGraphFromFile(const char *inFile,const char *outDir,
const char *outFile,MscOutputFormat format)
{
QCString absOutFile = outDir;
absOutFile+=portable_pathSeparator();
absOutFile+=outFile;
// chdir to the output dir, so dot can find the font file.
QCString oldDir = convertToQCString(QDir::currentDirPath());
// 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";
QCString mscArgs;
QCString extension;
if (format==MSC_BITMAP)
{
mscArgs+="-T png";
extension=".png";
}
else if (format==MSC_EPS)
{
mscArgs+="-T eps";
extension=".eps";
}
mscArgs+=" -i \"";
mscArgs+=inFile;
mscArgs+=".msc\" -o \"";
mscArgs+=outFile;
mscArgs+=extension+"\"";
int exitCode;
//printf("*** running: %s %s\n",mscExe.data(),mscArgs.data());
if ((exitCode=portable_system(mscExe,mscArgs,FALSE))!=0)
{
goto error;
}
if ( (format==MSC_EPS) && (Config_getBool("USE_PDFLATEX")) )
{
QCString epstopdfArgs(maxCmdLine);
epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
outFile,outFile);
if (portable_system("epstopdf",epstopdfArgs)!=0)
{
err("Error: Problems running epstopdf. Check your TeX installation!\n");
}
}
error:
QDir::setCurrent(oldDir);
}
QString getMscImageMapFromFile(const QString& inFile, const QString& outDir,
const QCString& relPath)
{
QString outFile = inFile + ".map";
// chdir to the output dir, so dot can find the font file.
QCString oldDir = convertToQCString(QDir::currentDirPath());
// go to the html output directory (i.e. path)
QDir::setCurrent(outDir);
//printf("Going to dir %s\n",QDir::currentDirPath().data());
QCString mscExe = "mscgen";
QCString mscArgs = "-T ismap -i \"";
mscArgs+=inFile + ".msc\" -o \"";
mscArgs+=outFile + ".map\"";
int exitCode;
if ((exitCode=portable_system(mscExe,mscArgs,FALSE))!=0)
{
QDir::setCurrent(oldDir);
return "";
}
QString result;
QTextOStream tmpout(&result);
convertMapFile(tmpout, outFile+".map", relPath);
QDir().remove(outFile);
QDir::setCurrent(oldDir);
return result;
}
/******************************************************************************
*
*
*
* Copyright (C) 1997-2007 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
* granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
* Documents produced by Doxygen are derivative works derived from the
* input used in their production; they are not affected by this license.
*
*/
#ifndef _MSC_H
#define _MSC_H
#include "qtbc.h"
enum MscOutputFormat { MSC_BITMAP , MSC_EPS };
void writeMscGraphFromFile(const char *inFile,const char *outDir,
const char *outFile,MscOutputFormat format);
QString getMscImageMapFromFile(const QString& inFile, const QString& outDir,
const QCString& relPath);
#endif
...@@ -629,6 +629,7 @@ void PerlModDocVisitor::visit(DocVerbatim *s) ...@@ -629,6 +629,7 @@ void PerlModDocVisitor::visit(DocVerbatim *s)
case DocVerbatim::LatexOnly: type = "latexonly"; break; case DocVerbatim::LatexOnly: type = "latexonly"; break;
case DocVerbatim::XmlOnly: type = "xmlonly"; break; case DocVerbatim::XmlOnly: type = "xmlonly"; break;
case DocVerbatim::Dot: type = "dot"; break; case DocVerbatim::Dot: type = "dot"; break;
case DocVerbatim::Msc: type = "msc"; break;
} }
openItem(type); openItem(type);
m_output.addFieldQuotedString("content", s->text()); m_output.addFieldQuotedString("content", s->text());
......
...@@ -127,7 +127,10 @@ int portable_system(const char *command,const char *args,bool commandHasConsole ...@@ -127,7 +127,10 @@ int portable_system(const char *command,const char *args,bool commandHasConsole
SHELLEXECUTEINFO sInfo = { SHELLEXECUTEINFO sInfo = {
sizeof(SHELLEXECUTEINFO), /* structure size */ sizeof(SHELLEXECUTEINFO), /* structure size */
SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI, /* leave the process running */ SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI, /* tell us the process
* handle so we can wait till it's done |
* do not display msg box if error
*/
NULL, /* window handle */ NULL, /* window handle */
NULL, /* action to perform: open */ NULL, /* action to perform: open */
command, /* file to execute */ command, /* file to execute */
...@@ -334,12 +337,12 @@ const char *portable_ghostScriptCommand() ...@@ -334,12 +337,12 @@ const char *portable_ghostScriptCommand()
#endif #endif
} }
const char *portable_dotCommand() const char *portable_commandExtension()
{ {
#if defined(_WIN32) && !defined(__CYGWIN__) #if defined(_WIN32) && !defined(__CYGWIN__)
return "dot.exe"; return ".exe";
#else #else
return "dot"; return "";
#endif #endif
} }
......
...@@ -24,7 +24,7 @@ portable_off_t portable_ftell(FILE *f); ...@@ -24,7 +24,7 @@ portable_off_t portable_ftell(FILE *f);
char portable_pathSeparator(); char portable_pathSeparator();
char portable_pathListSeparator(); char portable_pathListSeparator();
const char * portable_ghostScriptCommand(); const char * portable_ghostScriptCommand();
const char * portable_dotCommand(); const char * portable_commandExtension();
bool portable_fileSystemIsCaseSensitive(); bool portable_fileSystemIsCaseSensitive();
FILE * portable_popen(const char *name,const char *type); FILE * portable_popen(const char *name,const char *type);
int portable_pclose(FILE *stream); int portable_pclose(FILE *stream);
......
...@@ -151,6 +151,7 @@ class PrintDocVisitor : public DocVisitor ...@@ -151,6 +151,7 @@ class PrintDocVisitor : public DocVisitor
case DocVerbatim::LatexOnly: printf("<latexonly>"); break; case DocVerbatim::LatexOnly: printf("<latexonly>"); break;
case DocVerbatim::XmlOnly: printf("<xmlonly>"); break; case DocVerbatim::XmlOnly: printf("<xmlonly>"); break;
case DocVerbatim::Dot: printf("<dot>"); break; case DocVerbatim::Dot: printf("<dot>"); break;
case DocVerbatim::Msc: printf("<msc>"); break;
} }
printf("%s",s->text().data()); printf("%s",s->text().data());
switch(s->type()) switch(s->type())
...@@ -162,6 +163,7 @@ class PrintDocVisitor : public DocVisitor ...@@ -162,6 +163,7 @@ class PrintDocVisitor : public DocVisitor
case DocVerbatim::LatexOnly: printf("</latexonly>"); break; case DocVerbatim::LatexOnly: printf("</latexonly>"); break;
case DocVerbatim::XmlOnly: printf("</xmlonly>"); break; case DocVerbatim::XmlOnly: printf("</xmlonly>"); break;
case DocVerbatim::Dot: printf("</dot>"); break; case DocVerbatim::Dot: printf("</dot>"); break;
case DocVerbatim::Msc: printf("</msc>"); break;
} }
} }
void visit(DocAnchor *a) void visit(DocAnchor *a)
......
...@@ -606,7 +606,7 @@ STARTDOCSYMS ^{B}"##"/[^#] ...@@ -606,7 +606,7 @@ STARTDOCSYMS ^{B}"##"/[^#]
<FromModItem>{ <FromModItem>{
"*" { // import all "*" { // import all
QCString item=g_packageName+"."+yytext; QCString item=g_packageName;
current->name=removeRedundantWhiteSpace(substitute(item,".","::")); current->name=removeRedundantWhiteSpace(substitute(item,".","::"));
current->fileName = yyFileName; current->fileName = yyFileName;
//printf("Adding using directive: found:%s:%d name=%s\n",yyFileName.data(),yyLineNr,current->name.data()); //printf("Adding using directive: found:%s:%d name=%s\n",yyFileName.data(),yyLineNr,current->name.data());
......
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include "message.h" #include "message.h"
#include <qfileinfo.h> #include <qfileinfo.h>
#include "parserintf.h" #include "parserintf.h"
#include "msc.h"
//#define DBG_RTF(x) m_t << x //#define DBG_RTF(x) m_t << x
...@@ -372,6 +373,31 @@ void RTFDocVisitor::visit(DocVerbatim *s) ...@@ -372,6 +373,31 @@ void RTFDocVisitor::visit(DocVerbatim *s)
if (Config_getBool("DOT_CLEANUP")) file.remove(); if (Config_getBool("DOT_CLEANUP")) file.remove();
} }
break; break;
case DocVerbatim::Msc:
{
static int mscindex = 1;
QCString baseName(4096);
baseName.sprintf("%s%d",
(Config_getString("RTF_OUTPUT")+"/inline_mscgraph_").data(),
mscindex++
);
QFile file(baseName+".msc");
if (!file.open(IO_WriteOnly))
{
err("Could not open file %s for writing\n",baseName.data());
}
QCString text = "msc {";
text+=s->text();
text+="}";
file.writeBlock( text, text.length() );
file.close();
m_t << "\\par{\\qc "; // center picture
writeMscFile(baseName);
m_t << "} ";
if (Config_getBool("DOT_CLEANUP")) file.remove();
}
break;
} }
m_lastIsPara=FALSE; m_lastIsPara=FALSE;
} }
...@@ -1420,4 +1446,23 @@ void RTFDocVisitor::writeDotFile(const QString &fileName) ...@@ -1420,4 +1446,23 @@ void RTFDocVisitor::writeDotFile(const QString &fileName)
m_lastIsPara=TRUE; m_lastIsPara=TRUE;
} }
void RTFDocVisitor::writeMscFile(const QString &fileName)
{
QString baseName=fileName;
int i;
if ((i=baseName.findRev('/'))!=-1)
{
baseName=baseName.right(baseName.length()-i-1);
}
QString outDir = Config_getString("RTF_OUTPUT");
writeMscGraphFromFile(fileName,outDir,baseName,MSC_BITMAP);
if (!m_lastIsPara) m_t << "\\par" << endl;
m_t << "{" << endl;
m_t << rtf_Style_Reset;
m_t << "\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
m_t << baseName << ".png";
m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
m_t << "}" << endl;
m_lastIsPara=TRUE;
}
...@@ -144,6 +144,7 @@ class RTFDocVisitor : public DocVisitor ...@@ -144,6 +144,7 @@ class RTFDocVisitor : public DocVisitor
void pushEnabled(); void pushEnabled();
void popEnabled(); void popEnabled();
void writeDotFile(const QString &fileName); void writeDotFile(const QString &fileName);
void writeMscFile(const QString &fileName);
//-------------------------------------- //--------------------------------------
// state variables // state variables
......
...@@ -1070,6 +1070,29 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) ...@@ -1070,6 +1070,29 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
<FindMembers>{BN}{1,80} { <FindMembers>{BN}{1,80} {
lineCount(); lineCount();
} }
<FindMembers>"@"{ID}{BN}*"(" {
if (insideJava) // Java annotation
{
lineCount();
lastSkipRoundContext = YY_START;
roundCount=1;
BEGIN( SkipRound );
}
else
{
REJECT;
}
}
<FindMembers>"@"{ID} {
if (insideJava) // Java annotation
{
// skip annotation
}
else
{
REJECT;
}
}
<PackageName>{ID}("."{ID})* { <PackageName>{ID}("."{ID})* {
isTypedef=FALSE; isTypedef=FALSE;
current->name = yytext; current->name = yytext;
...@@ -1186,7 +1209,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) ...@@ -1186,7 +1209,7 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
current->name = QCString(yytext).stripWhiteSpace(); current->name = QCString(yytext).stripWhiteSpace();
} }
} }
<FindMembers>{B}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba IDL interface <FindMembers>{B}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba IDL/Java interface
lineCount(); lineCount();
if (insideIDL || insideJava || insideCS || insideD || insidePHP) if (insideIDL || insideJava || insideCS || insideD || insidePHP)
{ {
...@@ -1219,12 +1242,12 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) ...@@ -1219,12 +1242,12 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
current->bodyLine = yyLineNr; current->bodyLine = yyLineNr;
BEGIN( CompoundName ); BEGIN( CompoundName );
} }
<FindMembers>{B}*"@interface"{BN}+ { // Objective-C class interface <FindMembers>{B}*"@interface"{BN}+ { // Objective-C class interface, or Java attribute
lineCount(); lineCount();
isTypedef=FALSE; isTypedef=FALSE;
current->section = Entry::CLASS_SEC; current->section = Entry::CLASS_SEC;
current->spec = Entry::Interface; current->spec = Entry::Interface;
current->objc = insideObjC = TRUE; current->objc = insideObjC = !insideJava;
current->protection = protection = Public ; current->protection = protection = Public ;
addType( current ) ; addType( current ) ;
current->type += " interface" ; current->type += " interface" ;
...@@ -1593,7 +1616,16 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) ...@@ -1593,7 +1616,16 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?)
sharpCount++; sharpCount++;
} }
<EndTemplate>">>" { <EndTemplate>">>" {
current->name+=yytext; if (insideJava || insideCS)
{
unput('>');
unput(' ');
unput('>');
}
else
{
current->name+=yytext;
}
// *currentTemplateSpec+=yytext; // *currentTemplateSpec+=yytext;
} }
<EndTemplate>">" { <EndTemplate>">" {
......
...@@ -1016,6 +1016,8 @@ class TranslatorBrazilian : public Translator ...@@ -1016,6 +1016,8 @@ class TranslatorBrazilian : public Translator
"class Undocumented { };\n\n" "class Undocumented { };\n\n"
"/*! Class that is inherited using public inheritance */\n" "/*! Class that is inherited using public inheritance */\n"
"class PublicBase : public Truncated { };\n\n" "class PublicBase : public Truncated { };\n\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
"/*! Class that is inherited using protected inheritance */\n" "/*! Class that is inherited using protected inheritance */\n"
"class ProtectedBase { };\n\n" "class ProtectedBase { };\n\n"
"/*! Class that is inherited using private inheritance */\n" "/*! Class that is inherited using private inheritance */\n"
...@@ -1026,7 +1028,8 @@ class TranslatorBrazilian : public Translator ...@@ -1026,7 +1028,8 @@ class TranslatorBrazilian : public Translator
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
" Used *m_usedClass;\n" " Used *m_usedClass;\n"
......
...@@ -1038,7 +1038,7 @@ class TranslatorCatalan : public Translator ...@@ -1038,7 +1038,7 @@ class TranslatorCatalan : public Translator
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -912,6 +912,8 @@ class TranslatorChinese : public Translator ...@@ -912,6 +912,8 @@ class TranslatorChinese : public Translator
"class Undocumented { };\n\n" "class Undocumented { };\n\n"
"/*! 被公有继承的类 */\n" "/*! 被公有继承的类 */\n"
"class PublicBase : public Truncated { };\n\n" "class PublicBase : public Truncated { };\n\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
"/*! 被保护继承的类 */\n" "/*! 被保护继承的类 */\n"
"class ProtectedBase { };\n\n" "class ProtectedBase { };\n\n"
"/*! 被私有继承的类 */\n" "/*! 被私有继承的类 */\n"
...@@ -922,7 +924,8 @@ class TranslatorChinese : public Translator ...@@ -922,7 +924,8 @@ class TranslatorChinese : public Translator
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
" Used *m_usedClass;\n" " Used *m_usedClass;\n"
......
...@@ -1126,7 +1126,7 @@ class TranslatorGerman : public Translator ...@@ -1126,7 +1126,7 @@ class TranslatorGerman : public Translator
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -1002,7 +1002,7 @@ class TranslatorDanish : public Translator ...@@ -1002,7 +1002,7 @@ class TranslatorDanish : public Translator
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -1039,7 +1039,7 @@ class TranslatorEnglish : public Translator ...@@ -1039,7 +1039,7 @@ class TranslatorEnglish : public Translator
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -1013,7 +1013,7 @@ class TranslatorSpanish : public Translator ...@@ -1013,7 +1013,7 @@ class TranslatorSpanish : public Translator
"class PublicBase : public Truncated { };\n\n" "class PublicBase : public Truncated { };\n\n"
"/*! Clase plantilla */\n" "/*! Clase plantilla */\n"
"template<class T> class Templ { };\n\n" "template<class T> class Templ { };\n\n"
"/*! Clase que es heredera usando herencia protegida */\n" "/*! Clase que es heredera usando herencia protegida */\n"
"class ProtectedBase { };\n\n" "class ProtectedBase { };\n\n"
"/*! Clase que es heredera usando herencia privada */\n" "/*! Clase que es heredera usando herencia privada */\n"
"class PrivateBase { };\n\n" "class PrivateBase { };\n\n"
...@@ -1023,7 +1023,7 @@ class TranslatorSpanish : public Translator ...@@ -1023,7 +1023,7 @@ class TranslatorSpanish : public Translator
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -1184,7 +1184,7 @@ class TranslatorFrench : public Translator ...@@ -1184,7 +1184,7 @@ class TranslatorFrench : public Translator
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -1027,6 +1027,8 @@ class TranslatorGreek : public Translator ...@@ -1027,6 +1027,8 @@ class TranslatorGreek : public Translator
"class Undocumented { };\n\n" "class Undocumented { };\n\n"
"/*! Class that is inherited using public inheritance */\n" "/*! Class that is inherited using public inheritance */\n"
"class PublicBase : public Truncated { };\n\n" "class PublicBase : public Truncated { };\n\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
"/*! Class that is inherited using protected inheritance */\n" "/*! Class that is inherited using protected inheritance */\n"
"class ProtectedBase { };\n\n" "class ProtectedBase { };\n\n"
"/*! Class that is inherited using private inheritance */\n" "/*! Class that is inherited using private inheritance */\n"
...@@ -1037,7 +1039,8 @@ class TranslatorGreek : public Translator ...@@ -1037,7 +1039,8 @@ class TranslatorGreek : public Translator
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
" Used *m_usedClass;\n" " Used *m_usedClass;\n"
......
...@@ -757,6 +757,8 @@ class TranslatorCroatian : public Translator ...@@ -757,6 +757,8 @@ class TranslatorCroatian : public Translator
"class Undocumented { };\n\n" "class Undocumented { };\n\n"
"/*! Klasa koja je naslijeena public */\n" "/*! Klasa koja je naslijeena public */\n"
"class PublicBase : public Truncated { };\n\n" "class PublicBase : public Truncated { };\n\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
"/*! Klasa koje je naslijeena protected */\n" "/*! Klasa koje je naslijeena protected */\n"
"class ProtectedBase { };\n\n" "class ProtectedBase { };\n\n"
"/*! Klasa koje je naslijeena private */\n" "/*! Klasa koje je naslijeena private */\n"
...@@ -767,7 +769,8 @@ class TranslatorCroatian : public Translator ...@@ -767,7 +769,8 @@ class TranslatorCroatian : public Translator
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
" Used *m_usedClass;\n" " Used *m_usedClass;\n"
......
...@@ -1018,7 +1018,7 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6 ...@@ -1018,7 +1018,7 @@ class TranslatorHungarian : public TranslatorAdapter_1_4_6
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -1049,7 +1049,7 @@ class TranslatorIndonesian : public TranslatorAdapter_1_4_6 ...@@ -1049,7 +1049,7 @@ class TranslatorIndonesian : public TranslatorAdapter_1_4_6
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -1029,6 +1029,8 @@ class TranslatorItalian : public Translator ...@@ -1029,6 +1029,8 @@ class TranslatorItalian : public Translator
"class Undocumented { };\n\n" "class Undocumented { };\n\n"
"/*! Classe che utilizza una ereditarietà pubblica */\n" "/*! Classe che utilizza una ereditarietà pubblica */\n"
"class PublicBase : public Truncated { };\n\n" "class PublicBase : public Truncated { };\n\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
"/*! Classe che utilizza una ereditarietà protetta*/\n" "/*! Classe che utilizza una ereditarietà protetta*/\n"
"class ProtectedBase { };\n\n" "class ProtectedBase { };\n\n"
"/*! Classe che utilizza una ereditarietà privata*/\n" "/*! Classe che utilizza una ereditarietà privata*/\n"
...@@ -1039,7 +1041,8 @@ class TranslatorItalian : public Translator ...@@ -1039,7 +1041,8 @@ class TranslatorItalian : public Translator
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
" Used *m_usedClass;\n" " Used *m_usedClass;\n"
......
...@@ -1001,6 +1001,8 @@ class TranslatorJapanese : public Translator ...@@ -1001,6 +1001,8 @@ class TranslatorJapanese : public Translator
"class Undocumented { };\n\n" "class Undocumented { };\n\n"
"/*! public で継承されたクラス */\n" "/*! public で継承されたクラス */\n"
"class PublicBase : public Truncated { };\n\n" "class PublicBase : public Truncated { };\n\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
"/*! protected で継承されたクラス */\n" "/*! protected で継承されたクラス */\n"
"class ProtectedBase { };\n\n" "class ProtectedBase { };\n\n"
"/*! private で継承されたクラス */\n" "/*! private で継承されたクラス */\n"
...@@ -1011,7 +1013,8 @@ class TranslatorJapanese : public Translator ...@@ -1011,7 +1013,8 @@ class TranslatorJapanese : public Translator
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
" Used *m_usedClass;\n" " Used *m_usedClass;\n"
......
...@@ -1008,7 +1008,7 @@ class TranslatorKorean : public TranslatorAdapter_1_4_6 ...@@ -1008,7 +1008,7 @@ class TranslatorKorean : public TranslatorAdapter_1_4_6
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -1027,7 +1027,7 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6 ...@@ -1027,7 +1027,7 @@ class TranslatorLithuanian : public TranslatorAdapter_1_4_6
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -655,6 +655,8 @@ class TranslatorDutch : public Translator ...@@ -655,6 +655,8 @@ class TranslatorDutch : public Translator
"class Undocumented { };\n\n" "class Undocumented { };\n\n"
"/*! Klasse met public inheritance */\n" "/*! Klasse met public inheritance */\n"
"class PublicBase : public Truncated { };\n\n" "class PublicBase : public Truncated { };\n\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
"/*! Klasse met protected inheritance */\n" "/*! Klasse met protected inheritance */\n"
"class ProtectedBase { };\n\n" "class ProtectedBase { };\n\n"
"/*! Klasse met private inheritance */\n" "/*! Klasse met private inheritance */\n"
...@@ -665,7 +667,8 @@ class TranslatorDutch : public Translator ...@@ -665,7 +667,8 @@ class TranslatorDutch : public Translator
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
" Used *m_usedClass;\n" " Used *m_usedClass;\n"
......
...@@ -1057,6 +1057,8 @@ class TranslatorNorwegian : public TranslatorAdapter_1_4_6 ...@@ -1057,6 +1057,8 @@ class TranslatorNorwegian : public TranslatorAdapter_1_4_6
"class Undocumented { };\n\n" "class Undocumented { };\n\n"
"/*! Klasse med public-arv */\n" "/*! Klasse med public-arv */\n"
"class PublicBase : public Truncated { };\n\n" "class PublicBase : public Truncated { };\n\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
"/*! Klasse med protected-arv */\n" "/*! Klasse med protected-arv */\n"
"class ProtectedBase { };\n\n" "class ProtectedBase { };\n\n"
"/*! Klasse med private-arv */\n" "/*! Klasse med private-arv */\n"
...@@ -1067,7 +1069,7 @@ class TranslatorNorwegian : public TranslatorAdapter_1_4_6 ...@@ -1067,7 +1069,7 @@ class TranslatorNorwegian : public TranslatorAdapter_1_4_6
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -1044,6 +1044,8 @@ class TranslatorPolish : public TranslatorAdapter_1_4_6 ...@@ -1044,6 +1044,8 @@ class TranslatorPolish : public TranslatorAdapter_1_4_6
"class Nieudokumentowana { };\n\n" "class Nieudokumentowana { };\n\n"
"/*! Klasa, która jest dziedziczona publicznie */\n" "/*! Klasa, która jest dziedziczona publicznie */\n"
"class PublicznaBaza : public Okrojona { };\n\n" "class PublicznaBaza : public Okrojona { };\n\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
"/*! Klasa, która jest dziedziczona przy u¿yciu dziedziczenia chronionego */\n" "/*! Klasa, która jest dziedziczona przy u¿yciu dziedziczenia chronionego */\n"
"class ChronionaBaza { };\n\n" "class ChronionaBaza { };\n\n"
"/*! Klasa, która jest dziedziczona prywatnie */\n" "/*! Klasa, która jest dziedziczona prywatnie */\n"
...@@ -1054,7 +1056,8 @@ class TranslatorPolish : public TranslatorAdapter_1_4_6 ...@@ -1054,7 +1056,8 @@ class TranslatorPolish : public TranslatorAdapter_1_4_6
"class Dziedziczona : public PublicznaBaza,\n" "class Dziedziczona : public PublicznaBaza,\n"
" protected ChronionaBaza,\n" " protected ChronionaBaza,\n"
" private PrywatnaBaza,\n" " private PrywatnaBaza,\n"
" public Nieudokumentowana\n" " public Nieudokumentowana,\n"
" public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
" Uzyta *m_usedClass;\n" " Uzyta *m_usedClass;\n"
......
...@@ -1043,6 +1043,8 @@ class TranslatorPortuguese : public TranslatorAdapter_1_3_3 ...@@ -1043,6 +1043,8 @@ class TranslatorPortuguese : public TranslatorAdapter_1_3_3
"class Undocumented { };\n\n" "class Undocumented { };\n\n"
"/*! Classe derivada usando derivação pública */\n" "/*! Classe derivada usando derivação pública */\n"
"class PublicBase : public Truncated { };\n\n" "class PublicBase : public Truncated { };\n\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
"/*! Classe derivada usando derivação protegida */\n" "/*! Classe derivada usando derivação protegida */\n"
"class ProtectedBase { };\n\n" "class ProtectedBase { };\n\n"
"/*! Classe derivada usando derivação privada */\n" "/*! Classe derivada usando derivação privada */\n"
...@@ -1053,7 +1055,8 @@ class TranslatorPortuguese : public TranslatorAdapter_1_3_3 ...@@ -1053,7 +1055,8 @@ class TranslatorPortuguese : public TranslatorAdapter_1_3_3
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
" Used *m_usedClass;\n" " Used *m_usedClass;\n"
......
...@@ -1073,6 +1073,8 @@ class TranslatorRomanian : public TranslatorAdapter_1_4_1 ...@@ -1073,6 +1073,8 @@ class TranslatorRomanian : public TranslatorAdapter_1_4_1
"class Undocumented { };\n\n" "class Undocumented { };\n\n"
"/*! Clasã care este moºtenitã în mod public */\n" "/*! Clasã care este moºtenitã în mod public */\n"
"class PublicBase : public Truncated { };\n\n" "class PublicBase : public Truncated { };\n\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
"/*! Clasã care este moºtenitã în mod protejat */\n" "/*! Clasã care este moºtenitã în mod protejat */\n"
"class ProtectedBase { };\n\n" "class ProtectedBase { };\n\n"
"/*! Clasã care este moºtenitã în mod privat */\n" "/*! Clasã care este moºtenitã în mod privat */\n"
...@@ -1083,7 +1085,8 @@ class TranslatorRomanian : public TranslatorAdapter_1_4_1 ...@@ -1083,7 +1085,8 @@ class TranslatorRomanian : public TranslatorAdapter_1_4_1
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
" Used *m_usedClass;\n" " Used *m_usedClass;\n"
......
...@@ -917,7 +917,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_4_6 ...@@ -917,7 +917,7 @@ class TranslatorSwedish : public TranslatorAdapter_1_4_6
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -684,6 +684,8 @@ class TranslatorSlovene : public TranslatorAdapter_1_4_6 ...@@ -684,6 +684,8 @@ class TranslatorSlovene : public TranslatorAdapter_1_4_6
"class Undocumented { };\n\n" "class Undocumented { };\n\n"
"/*! Razred, ki ga dedujemo s pomoèjo javnega dedovanja */\n" "/*! Razred, ki ga dedujemo s pomoèjo javnega dedovanja */\n"
"class PublicBase : public Truncated { };\n\n" "class PublicBase : public Truncated { };\n\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
"/*! Razred, ki ga dedujemo s pomoèjo za¹èitenega dedovanja */\n" "/*! Razred, ki ga dedujemo s pomoèjo za¹èitenega dedovanja */\n"
"class ProtectedBase { };\n\n" "class ProtectedBase { };\n\n"
"/*! Razred, ki ga dedujemo s pomoèjo skritega dedovanja */\n" "/*! Razred, ki ga dedujemo s pomoèjo skritega dedovanja */\n"
...@@ -694,7 +696,8 @@ class TranslatorSlovene : public TranslatorAdapter_1_4_6 ...@@ -694,7 +696,8 @@ class TranslatorSlovene : public TranslatorAdapter_1_4_6
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
" Used *m_usedClass;\n" " Used *m_usedClass;\n"
......
...@@ -1055,6 +1055,8 @@ class TranslatorSlovak : public TranslatorAdapter_1_2_18 ...@@ -1055,6 +1055,8 @@ class TranslatorSlovak : public TranslatorAdapter_1_2_18
"/*! Odvoden trieda s verejnm (public) dedenm bzovej triedy. */\n" "/*! Odvoden trieda s verejnm (public) dedenm bzovej triedy. */\n"
"class PublicBase : public Truncated { };\n\n" "class PublicBase : public Truncated { };\n\n"
"/*! Odvoden trieda s chrnenm (protected) dedenm bzovej triedy. */\n" "/*! Odvoden trieda s chrnenm (protected) dedenm bzovej triedy. */\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
"class ProtectedBase { };\n\n" "class ProtectedBase { };\n\n"
"/*! Odvoden trieda s privtnym dedenm bzovej triedy. */\n" "/*! Odvoden trieda s privtnym dedenm bzovej triedy. */\n"
"class PrivateBase { };\n\n" "class PrivateBase { };\n\n"
...@@ -1063,9 +1065,10 @@ class TranslatorSlovak : public TranslatorAdapter_1_2_18 ...@@ -1063,9 +1065,10 @@ class TranslatorSlovak : public TranslatorAdapter_1_2_18
"/*! Odvoden trieda, ktor rznym spsobom ded od viacerch bzovch " "/*! Odvoden trieda, ktor rznym spsobom ded od viacerch bzovch "
"tried. */\n" "tried. */\n"
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
" Used *m_usedClass;\n" " Used *m_usedClass;\n"
......
...@@ -1071,7 +1071,7 @@ private: ...@@ -1071,7 +1071,7 @@ private:
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -1068,7 +1068,7 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_4_6 ...@@ -1068,7 +1068,7 @@ class TranslatorChinesetraditional : public TranslatorAdapter_1_4_6
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -1056,6 +1056,8 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1 ...@@ -1056,6 +1056,8 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
"class Undocumented { };\n\n" "class Undocumented { };\n\n"
"/*! úÁÇÁÌØÎÏÄÏÓÔÕÐÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n" "/*! úÁÇÁÌØÎÏÄÏÓÔÕÐÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n"
"class PublicBase : public Truncated { };\n\n" "class PublicBase : public Truncated { };\n\n"
"/*! A template class */\n"
"template<class T> class Templ { };\n\n"
"/*! úÁÈÉÝÅÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n" "/*! úÁÈÉÝÅÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n"
"class ProtectedBase { };\n\n" "class ProtectedBase { };\n\n"
"/*! ðÒÉ×ÁÔÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n" "/*! ðÒÉ×ÁÔÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n"
...@@ -1066,7 +1068,8 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1 ...@@ -1066,7 +1068,8 @@ class TranslatorUkrainian : public TranslatorAdapter_1_4_1
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Undocumented\n" " public Undocumented,\n"
" public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
" Used *m_usedClass;\n" " Used *m_usedClass;\n"
......
...@@ -1021,7 +1021,7 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_4_6 ...@@ -1021,7 +1021,7 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_4_6
"class Inherited : public PublicBase,\n" "class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n" " protected ProtectedBase,\n"
" private PrivateBase,\n" " private PrivateBase,\n"
" public Ongedokumenteer\n" " public Ongedokumenteer,\n"
" public Templ<int>\n" " public Templ<int>\n"
"{\n" "{\n"
" private:\n" " private:\n"
......
...@@ -71,7 +71,7 @@ class TranslatorDecoder : public Translator ...@@ -71,7 +71,7 @@ class TranslatorDecoder : public Translator
{ {
oSize -= oLeft; oSize -= oLeft;
output.resize(oSize+1); output.resize(oSize+1);
output.at(oSize+1)='\0'; output.at(oSize)='\0';
return output; return output;
} }
else else
......
...@@ -395,6 +395,10 @@ QCString resolveTypeDef(Definition *context,const QCString &qualifiedName, ...@@ -395,6 +395,10 @@ QCString resolveTypeDef(Definition *context,const QCString &qualifiedName,
// qualifiedName.data(),context->name().data(),md->typeString() // qualifiedName.data(),context->name().data(),md->typeString()
// ); // );
result=md->typeString(); result=md->typeString();
if (result.find("*)")!=-1) // typedef of a function/member pointer
{
result+=md->argsString();
}
if (typedefContext) *typedefContext=md->getOuterScope(); if (typedefContext) *typedefContext=md->getOuterScope();
} }
else else
...@@ -1929,7 +1933,7 @@ QCString recodeString(const QCString &str,const char *fromEncoding,const char *t ...@@ -1929,7 +1933,7 @@ QCString recodeString(const QCString &str,const char *fromEncoding,const char *t
{ {
outputSize-=oLeft; outputSize-=oLeft;
output.resize(outputSize+1); output.resize(outputSize+1);
output.at(outputSize+1)='\0'; output.at(outputSize)='\0';
//printf("iconv: input size=%d output size=%d\n[%s]\n",size,newSize,srcBuf.data()); //printf("iconv: input size=%d output size=%d\n[%s]\n",size,newSize,srcBuf.data());
} }
else else
...@@ -1966,7 +1970,7 @@ QCString transcodeCharacterStringToUTF8(const QCString &input) ...@@ -1966,7 +1970,7 @@ QCString transcodeCharacterStringToUTF8(const QCString &input)
{ {
outputSize-=oLeft; outputSize-=oLeft;
output.resize(outputSize+1); output.resize(outputSize+1);
output.at(outputSize+1)='\0'; output.at(outputSize)='\0';
//printf("iconv: input size=%d output size=%d\n[%s]\n",size,newSize,srcBuf.data()); //printf("iconv: input size=%d output size=%d\n[%s]\n",size,newSize,srcBuf.data());
} }
else else
......
...@@ -208,6 +208,11 @@ void XmlDocVisitor::visit(DocVerbatim *s) ...@@ -208,6 +208,11 @@ void XmlDocVisitor::visit(DocVerbatim *s)
filter(s->text()); filter(s->text());
m_t << "</dot>"; m_t << "</dot>";
break; break;
case DocVerbatim::Msc:
m_t << "<msc>";
filter(s->text());
m_t << "</msc>";
break;
} }
} }
......
...@@ -1310,6 +1310,10 @@ ...@@ -1310,6 +1310,10 @@
/> />
</FileConfiguration> </FileConfiguration>
</File> </File>
<File
RelativePath="..\src\msc.cpp"
>
</File>
<File <File
RelativePath="..\src\namespacedef.cpp" RelativePath="..\src\namespacedef.cpp"
> >
...@@ -1953,6 +1957,10 @@ ...@@ -1953,6 +1957,10 @@
RelativePath="..\src\htmlhelp.h" RelativePath="..\src\htmlhelp.h"
> >
</File> </File>
<File
RelativePath=".\iconv.h"
>
</File>
<File <File
RelativePath="..\src\image.h" RelativePath="..\src\image.h"
> >
...@@ -2033,6 +2041,10 @@ ...@@ -2033,6 +2041,10 @@
RelativePath="..\src\message.h" RelativePath="..\src\message.h"
> >
</File> </File>
<File
RelativePath="..\src\msc.h"
>
</File>
<File <File
RelativePath="..\src\namespacedef.h" RelativePath="..\src\namespacedef.h"
> >
......
...@@ -52,8 +52,8 @@ ...@@ -52,8 +52,8 @@
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
Optimization="0" Optimization="0"
AdditionalIncludeDirectories="$(QTDIR)\include;..\src" AdditionalIncludeDirectories="$(QTDIR)\include;..\src;."
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE" PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;LIBICONV_STATIC"
MinimalRebuild="true" MinimalRebuild="true"
BasicRuntimeChecks="3" BasicRuntimeChecks="3"
RuntimeLibrary="1" RuntimeLibrary="1"
...@@ -73,7 +73,7 @@ ...@@ -73,7 +73,7 @@
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="$(QTDIR)\lib\qt-mt336.lib $(QTDIR)\lib\qtmain.lib" AdditionalDependencies="$(QTDIR)\lib\qt-mt336.lib $(QTDIR)\lib\qtmain.lib iconv.lib"
OutputFile="..\bin\Debug\doxywizard.exe" OutputFile="..\bin\Debug\doxywizard.exe"
LinkIncremental="2" LinkIncremental="2"
GenerateManifest="false" GenerateManifest="false"
...@@ -138,8 +138,8 @@ ...@@ -138,8 +138,8 @@
/> />
<Tool <Tool
Name="VCCLCompilerTool" Name="VCCLCompilerTool"
AdditionalIncludeDirectories="$(QTDIR)\include;..\src" AdditionalIncludeDirectories="$(QTDIR)\include;..\src;."
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE" PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS;_CRT_SECURE_NO_DEPRECATE;LIBICONV_STATIC"
RuntimeLibrary="0" RuntimeLibrary="0"
UsePrecompiledHeader="0" UsePrecompiledHeader="0"
WarningLevel="3" WarningLevel="3"
...@@ -158,7 +158,7 @@ ...@@ -158,7 +158,7 @@
/> />
<Tool <Tool
Name="VCLinkerTool" Name="VCLinkerTool"
AdditionalDependencies="$(QTDIR)\lib\qt-mt336.lib $(QTDIR)\lib\qtmain.lib" AdditionalDependencies="$(QTDIR)\lib\qt-mt336.lib $(QTDIR)\lib\qtmain.lib iconv.lib"
OutputFile="..\bin\doxywizard.exe" OutputFile="..\bin\doxywizard.exe"
LinkIncremental="1" LinkIncremental="1"
GenerateManifest="false" GenerateManifest="false"
...@@ -303,6 +303,10 @@ ...@@ -303,6 +303,10 @@
RelativePath="..\addon\doxywizard\expert.h" RelativePath="..\addon\doxywizard\expert.h"
> >
</File> </File>
<File
RelativePath=".\iconv.h"
>
</File>
<File <File
RelativePath="..\addon\doxywizard\input.h" RelativePath="..\addon\doxywizard\input.h"
> >
......
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