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

Release-1.8.4

parent 8dc4ff6d
DOXYGEN Version 1.8.3.1-20130512
DOXYGEN Version 1.8.4
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (12 May 2013)
Dimitri van Heesch (19 May 2013)
DOXYGEN Version 1.8.3.1_20130512
DOXYGEN Version 1.8.4
Please read INSTALL for compilation instructions.
......@@ -26,4 +26,4 @@ forum.
Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (12 May 2013)
Dimitri van Heesch (dimitri@stack.nl) (19 May 2013)
......@@ -17,10 +17,10 @@
doxygen_version_major=1
doxygen_version_minor=8
doxygen_version_revision=3.1
doxygen_version_revision=4
#NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
doxygen_version_mmn=20130512
doxygen_version_mmn=NO
bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
......@@ -478,7 +478,7 @@ if test "$f_libclang" = YES; then
if test "$f_libclangstatic" = NO; then
libclang_link="-L $i -lclang"
else
libclang_link="$i/libLLVMBitReader.a $i/libLLVMMC.a $i/libLLVMMCParser.a $i/libLLVMSupport.a $i/libclang.a $i/libclangAST.a $i/libclangAnalysis.a $i/libclangBasic.a $i/libclangDriver.a $i/libclangEdit.a $i/libclangFrontend.a $i/libclangLex.a $i/libclangParse.a $i/libclangRewriteCore.a $i/libclangSema.a $i/libclangSerialization.a $i/libclangStaticAnalyzerCore.a"
libclang_link="$i/libclang.a $i/libclangFrontend.a $i/libclangSerialization.a $i/libclangParse.a $i/libclangSema.a $i/libclangAnalysis.a $i/libclangStaticAnalyzerCore.a $i/libclangAST.a $i/libclangBasic.a $i/libclangDriver.a $i/libclangEdit.a $i/libclangLex.a $i/libclangRewriteCore.a $i/libLLVMBitReader.a $i/libLLVMMC.a $i/libLLVMMCParser.a $i/libLLVMSupport.a -ldl -lpthread"
fi
break
fi
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -274,7 +274,7 @@ documentation -> docs -> dox
generator -> gen
\endverbatim
At the time I was looking into lex and yacc, where a lot of things start with
At the time I was looking into \c lex and \c yacc, where a lot of things start with
"yy", so the "y" slipped in and made things pronounceable
(the proper pronouncement is Docs-ee-gen, so with a long "e").
......
......@@ -20,7 +20,7 @@ Here is a list of all HTML commands that may be used inside the
documentation. Note that although these HTML tags are translated to the
proper commands for output formats other than HTML, all attributes
of a HTML tag are passed on to the HTML output only
(the HREF and NAME attributes for the A tag are the only exception).
(the \c HREF and \c NAME attributes for the \c A tag are the only exception).
<ul>
<li><tt>\<A HREF="..."\></tt> Starts a hyperlink
......@@ -89,7 +89,7 @@ of a HTML tag are passed on to the HTML output only
<li><tt>\<SUB\></tt> Starts a piece of text displayed in subscript.
<li><tt>\</SUB\></tt> Ends a <tt>\<SUB\></tt> section.
<li><tt>\<SUP\></tt> Starts a piece of text displayed in superscript.
<li><tt>\</SUP\></tt> Ends a <tt>\</SUP\></tt> section.
<li><tt>\</SUP\></tt> Ends a <tt>\<SUP\></tt> section.
<li><tt>\<TABLE\></tt> starts a table.
<li><tt>\</TABLE\></tt> ends a table.
<li><tt>\<TD\></tt> Starts a new table data element.
......
......@@ -29,16 +29,16 @@ 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 GNU make, and strip
\c flex, \c bison and <code>GNU make</code>, and \c strip
\addindex flex
\addindex bison
\addindex make
\addindex strip
<li>In order to generate a Makefile for your platform, you need
<li>In order to generate a \c Makefile for your platform, you need
<a href="http://www.perl.com/">perl</a>
\addindex perl
<li>The configure script assume the availability of standard UNIX tools such
as sed, date, find, uname, mv, cp, cat, echo, tr, cd, and rm.
as <code>sed, date, find, uname, mv, cp, cat, echo, tr, cd</code> and \c rm.
</ul>
To take full advantage of doxygen's features the following additional
......@@ -168,9 +168,9 @@ standard installation procedure that is required for these packages.
<b>Qt problems</b>
The Qt include files and libraries are not a subdirectory of the
directory pointed to by QTDIR on some systems
(for instance on Red Hat 6.0 includes are in /usr/include/qt and
libs are in /usr/lib).
directory pointed to by <code>QTDIR</code> on some systems
(for instance on Red Hat 6.0 includes are in <code>/usr/include/qt</code> and
libs are in <code>/usr/lib</code>).
The solution: go to the root of the doxygen distribution and do:
......@@ -181,96 +181,26 @@ The solution: go to the root of the doxygen distribution and do:
ln -s your-qt-bin-dir-here bin
export QTDIR=$PWD
If you have a csh-like shell you should use <code>setenv QTDIR \$PWD</code>
If you have a <code>csh</code>-like shell you should use <code>setenv QTDIR \$PWD</code>
instead of the <code>export</code> command above.
Now install doxygen as described above.
<b>Bison problems</b>
Versions 1.31 to 1.34 of bison contain a "bug" that results in a
Versions 1.31 to 1.34 of \c bison contain a "bug" that results in a
compiler errors like this:
ce_parse.cpp:348: member `class CPPValue yyalloc::yyvs' with
<code>ce_parse.cpp:348: member `class CPPValue yyalloc::yyvs' with </code>
constructor not allowed in union
This problem has been solved in version 1.35 (versions before 1.31
will also work).
<b>Latex problems</b>
The file <code>a4wide.sty</code> is not available for all distributions. If
your distribution does not have it please select another paper type
in the config file (see the \ref cfg_paper_type "PAPER_TYPE" tag in the
config file).
<b>HP-UX \& Digital UNIX problems</b>
If you are compiling for HP-UX with aCC and you get this error:
/opt/aCC/lbin/ld: Unsatisfied symbols:
alloca (code)
then you should (according to Anke Selig) edit <code>ce_parse.cpp</code>
and replace
extern "C" {
void *alloca (unsigned int);
};
with
#include <alloca.h>
If that does not help, try removing <code>ce_parse.cpp</code> and let
bison rebuild it (this worked for me).
If you are compiling for Digital UNIX, the same problem can be solved
(according to Barnard Schmallhof) by replacing the following in
ce_parse.cpp:
\verbatim
#else /* not GNU C. */
#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
|| defined (__sparc) || defined (__sgi)
#include <alloca.h>
\endverbatim
with
\verbatim
#else /* not GNU C. */
#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
|| defined (__sparc) || defined (__sgi) || defined (__osf__)
#include <alloca.h>
\endverbatim
Alternatively, one could fix the problem at the bison side.
Here is patch for bison.simple (provided by Andre Johansen):
\verbatim
--- bison.simple~ Tue Nov 18 11:45:53 1997
+++ bison.simple Mon Jan 26 15:10:26 1998
@@ -27,7 +27,7 @@
#ifdef __GNUC__
#define alloca __builtin_alloca
#else /* not GNU C. */
-#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
|| defined (__sparc) || defined (__sgi)
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
|| defined (__sparc) || defined (__sgi) || defined (__alpha)
#include <alloca.h>
#else /* not sparc */
#if defined (MSDOS) && !defined (__TURBOC__)
\endverbatim
The generated scanner.cpp that comes with doxygen is build with this
patch applied.
<b>Sun compiler problems</b>
It appears that doxygen doesn't work properly if it is compiled
with Sun's C++ WorkShop 6 Compiler. I cannot verify this myself as I do
with Sun's C++ WorkShop Compiler. I cannot verify this myself as I do
not have access to a Solaris machine with this compiler. With GNU compiler
it does work and installing Sun patch 111679-13 has also been reported
as a way to fix the problem.
......@@ -338,7 +268,7 @@ compile doxygen. Alternatively, you can compile doxygen
<a href="http://en.wikipedia.org/wiki/Cygwin">Cygwin</a>
or <a href="http://www.mingw.org/">MinGW</a>.
The next step is to install bison, flex, and tar
The next step is to install \c bison, \c flex, and \c tar
(see http://gnuwin32.sourceforge.net/packages.html).
This packages are needed during the
compilation process if you use a CVS snapshot of doxygen (the official source releases
......@@ -399,7 +329,7 @@ Here is what is required:
The good, tested, and free alternative is the <code>tar</code> utility
supplied with <a href="http://sourceware.cygnus.com/cygwin/">cygwin
tools</a>. Anyway, the cygwin's flex, bison, and sed are also
tools</a>. Anyway, the Cygwin's \c flex, \c bison, and \c sed are also
recommended below.
<li>Microsoft Visual C++ (I only tested with version 6.0).
......@@ -412,7 +342,7 @@ Here is what is required:
<li>Perl 5.0 or higher for Windows. This can be downloaded from:
http://www.ActiveState.com/Products/ActivePerl/
<li>The GNU tools flex, bison, and sed.
<li>The GNU tools \c flex, \c bison, and \c sed.
To get these working on Windows you should install the
<a href="http://sources.redhat.com/cygwin/">cygwin tools</a>
......
......@@ -242,7 +242,7 @@ when the translator was updated.
<td>Romanian</td>
<td>Ionut Dumitrascu<br/>Alexandru Iosup</td>
<td>reddumy at yahoo dot com<br/>aiosup at yahoo dot com</td>
<td>1.6.0</td>
<td>up-to-date</td>
</tr>
<tr bgcolor="#ffffff">
<td>Russian</td>
......@@ -266,7 +266,7 @@ when the translator was updated.
<td>Slovak</td>
<td>Kali+Laco Švec<br/>Petr Přikryl</td>
<td><span style="color: brown">[the Slovak language advisors]</span><br/>prikryl at atlas dot cz</td>
<td>1.8.04</td>
<td>up-to-date</td>
</tr>
<tr bgcolor="#ffffff">
<td>Slovene</td>
......@@ -403,7 +403,7 @@ when the translator was updated.
Portuguese & Rui Godinho Lopes & {\tt\tiny [resigned] rgl at ruilopes dot com} & 1.8.0 \\
~ & Fabio "FJTC" Jun Takada Chino & {\tt\tiny jun-chino at uol dot com dot br} & ~ \\
\hline
Romanian & Ionut Dumitrascu & {\tt\tiny reddumy at yahoo dot com} & 1.6.0 \\
Romanian & Ionut Dumitrascu & {\tt\tiny reddumy at yahoo dot com} & up-to-date \\
~ & Alexandru Iosup & {\tt\tiny aiosup at yahoo dot com} & ~ \\
\hline
Russian & Alexandr Chelpanov & {\tt\tiny cav at cryptopro dot ru} & 1.7.5 \\
......@@ -412,7 +412,7 @@ when the translator was updated.
\hline
SerbianCyrilic & Nedeljko Stefanovic & {\tt\tiny stenedjo at yahoo dot com} & 1.6.0 \\
\hline
Slovak & Kali+Laco Švec & {\tt\tiny [the Slovak language advisors]} & 1.8.04 \\
Slovak & Kali+Laco Švec & {\tt\tiny [the Slovak language advisors]} & up-to-date \\
~ & Petr Přikryl & {\tt\tiny prikryl at atlas dot cz} & ~ \\
\hline
Slovene & Matjaž Ostroveršnik & {\tt\tiny matjaz dot ostroversnik at ostri dot org} & 1.4.6 \\
......
......@@ -140,7 +140,7 @@ has its own advantages and disadvantages:
If you develop for or want to install the Qt application framework,
you will get an application
called <a href="http://qt-project.org/doc/qt-4.8/assistant-manual.html">Qt assistant</a>.
This is a help viewer for Qt Compressed Help files (.qch).
This is a help viewer for Qt Compressed Help files (<code>.qch</code>).
To enable this feature set \ref cfg_generate_qhp "GENERATE_QHP" to \c YES.
You also need to fill in the other Qt help related options, such as
......
......@@ -163,10 +163,10 @@ doxygen <config-file>
\endverbatim
Depending on your settings doxygen will create \c html, \c rtf,
\c latex, \c xml and/or \c man directories inside the output directory.
\c latex, \c xml, \c man, and/or docbook directories inside the output directory.
As the names suggest these directories contain the
generated documentation in HTML, RTF, \f$\mbox{\LaTeX}\f$, XML and
Unix-Man page format.
generated documentation in HTML, RTF, \f$\mbox{\LaTeX}\f$, XML,
Unix-Man page, and DocBook format.
The default output directory is the directory in which \c doxygen
is started. The root directory to which the output is written can be changed
......@@ -174,7 +174,7 @@ using the \ref cfg_output_directory "OUTPUT_DIRECTORY". The format specific
directory within the output directory can be selected using the
\ref cfg_html_output "HTML_OUTPUT", \ref cfg_rtf_output "RTF_OUTPUT",
\ref cfg_latex_output "LATEX_OUTPUT", \ref cfg_xml_output "XML_OUTPUT",
and \ref cfg_man_output "MAN_OUTPUT"
\ref cfg_man_output "MAN_OUTPUT", and \ref cfg_docbook_output "DOCBOOK_OUTPUT".
tags of the configuration file. If the output directory does not exist,
\c doxygen will try to create it for you (but it will \e not try to create
a whole path recursively, like <code>mkdir -p</code> does).
......@@ -250,12 +250,19 @@ the XML output produced by doxygen in an incremental way
(see `addon/doxmlparser/include/doxmlintf.h` for the interface of the library)
\subsection man_out Man page output
\addindex man
The generated man pages can be viewed using the \c man program. You do need
to make sure the man directory is in the man path (see the \c MANPATH
environment variable). Note that there are some limitations to the
capabilities of the man page format, so some information
(like class diagrams, cross references and formulas) will be lost.
\subsection docbook_out DocBook output
\addindex docbook
Doxygen can also generate output in the
<a href="http://www.docbook.org/">DocBook</a> format. How to process the
DocBook output is beyond the scope of this manual.
\section step3 Step 3: Documenting the sources
Although documenting the sources is presented as step 3, in a new project
......
......@@ -10,7 +10,7 @@ Macedonian, Norwegian, Persian, Polish, Portuguese, Romanian, Russian,
Serbian, SerbianCyrilic, Slovak, Slovene, Spanish, Swedish, Turkish,
Ukrainian, and Vietnamese.
Of them, 3 translators are up-to-date, 37 translators are based on
Of them, 5 translators are up-to-date, 35 translators are based on
some adapter class, and 2 are English based.
----------------------------------------------------------------------
......@@ -22,6 +22,8 @@ still may be some details listed even for them:
TranslatorEnglish
TranslatorKorean -- Change the base class to Translator.
TranslatorLatvian -- Reimplementation using UTF-8 suggested.
TranslatorRomanian -- Reimplementation using UTF-8 suggested.
TranslatorSlovak
----------------------------------------------------------------------
The following translator classes need some maintenance (the most
......@@ -35,9 +37,6 @@ must be implemented to become up-to-date:
TranslatorSpanish 1.8.04 8 methods to implement (3 %)
Note: Change the base class to TranslatorAdapter_1_8_4.
TranslatorSlovak 1.8.04 8 methods to implement (3 %)
Note: Change the base class to TranslatorAdapter_1_8_4.
TranslatorGreek 1.8.04 8 methods to implement (3 %)
Note: Change the base class to TranslatorAdapter_1_8_4.
......@@ -86,9 +85,6 @@ must be implemented to become up-to-date:
Note: Reimplementation using UTF-8 suggested.
TranslatorSerbianCyrilic 1.6.0 34 methods to implement (13 %)
TranslatorRomanian 1.6.0 34 methods to implement (13 %)
Note: Reimplementation using UTF-8 suggested.
TranslatorMacedonian 1.6.0 34 methods to implement (13 %)
TranslatorJapanese 1.6.0 33 methods to implement (13 %)
Note: Reimplementation using UTF-8 suggested.
......@@ -1134,47 +1130,10 @@ TranslatorPortuguese (TranslatorAdapter_1_8_0) 22 methods to implement (8 %)
virtual QCString trInstanceMethods()
TranslatorRomanian (TranslatorAdapter_1_6_0) 34 methods to implement (13 %)
TranslatorRomanian (Translator)
------------------
Implements 216 of the required methods (86 %).
Missing methods (should be implemented):
virtual QCString trDetailLevel()
virtual QCString trSearching()
virtual QCString trTemplateParameters()
virtual QCString trNoMatches()
virtual QCString trLoading()
virtual QCString trDateTime(int year, int month, int day, int dayOfWeek, int hour, int minutes, int seconds, bool includeTime)
virtual QCString trServices()
virtual QCString trFileIn(const char * name)
virtual QCString trClassMethods()
virtual QCString trProvidedByCategory()
virtual QCString trSingletonGeneratedFromFiles(bool single)
virtual QCString trGlobalNamespace()
virtual QCString trServiceReference(const char * sName)
virtual QCString trDesignOverview()
virtual QCString trAndMore(const QCString & number)
virtual QCString trConstantGroups()
virtual QCString trDirDepGraph(const char * name)
virtual QCString trDirRelation(const char * name)
virtual QCString trMethodDocumentation()
virtual QCString trEnumReference(const char * name)
virtual QCString trInheritedFrom(const char * members, const char * what)
virtual QCString trCiteReferences()
virtual QCString trAdditionalInheritedMembers()
virtual QCString trDirDependency(const char * name)
virtual QCString trInterfaces()
virtual QCString trCopyright()
virtual QCString trIncludesFileIn(const char * name)
virtual QCString trServiceGeneratedFromFiles(bool single)
virtual QCString trEnumGeneratedFromFiles(bool single)
virtual QCString trConstantGroupReference(const char * namespaceName)
virtual QCString trPanelSynchronisationTooltip(bool enable)
virtual QCString trExtendsClass()
virtual QCString trSingletonReference(const char * sName)
virtual QCString trInstanceMethods()
Implements 250 of the required methods (100 %).
TranslatorRussian (TranslatorAdapter_1_7_5) 25 methods to implement (10 %)
......@@ -1297,23 +1256,6 @@ TranslatorSerbianCyrilic (TranslatorAdapter_1_6_0) 34 methods to implement (1
virtual QCString trInstanceMethods()
TranslatorSlovak (TranslatorAdapter_1_8_2) 8 methods to implement (3 %)
----------------
Implements 242 of the required methods (96 %).
Missing methods (should be implemented):
virtual QCString trServices()
virtual QCString trSingletonGeneratedFromFiles(bool single)
virtual QCString trServiceReference(const char * sName)
virtual QCString trConstantGroups()
virtual QCString trInterfaces()
virtual QCString trServiceGeneratedFromFiles(bool single)
virtual QCString trConstantGroupReference(const char * namespaceName)
virtual QCString trSingletonReference(const char * sName)
TranslatorSlovene (TranslatorAdapter_1_4_6) 58 methods to implement (23 %)
-----------------
......
......@@ -31,7 +31,7 @@
or unions with the same name in your code. It should not crash however,
rather it should ignore all of the classes with the same name except one.
<li>Some commands do not work inside the arguments of other commands.
Inside a HTML link (i.e. \<a href="..."\>...\<a\>) for instance
Inside a HTML link (i.e. \<a&nbsp;href="..."\>...\<a\>) for instance
other commands (including other HTML commands) do not work!
The sectioning commands are an important exception.
<li>Redundant braces can confuse doxygen in some cases.
......
......@@ -28,7 +28,7 @@ Here is the list of tags supported by doxygen:
<li><tt>\<c\></tt> Identifies inline text that should be rendered as a
piece of code. Similar to using <tt>\<tt\></tt>text<tt>\</tt\></tt>.
<li><tt>\<code\></tt> Set one or more lines of source code or program output.
Note that this command behaves like <tt>\\code ... \\endcode</tt>
Note that this command behaves like \ref cmdcode "\\code" ... \ref cmdendcode "\\endcode"
for C# code, but it behaves like the HTML equivalent
<tt>\<code\>...\</code\></tt> for other languages.
<li><tt>\<description\></tt> Part of a <tt>\<list\></tt> command, describes an item.
......
......@@ -40,8 +40,10 @@ ClangParser *ClangParser::s_instance = 0;
class ClangParser::Private
{
public:
enum DetectedLang { Detected_Cpp, Detected_ObjC, Detected_ObjCpp };
Private() : tu(0), tokens(0), numTokens(0), cursors(0),
ufs(0), sources(0), numFiles(0), fileMapping(257)
ufs(0), sources(0), numFiles(0), fileMapping(257),
detectedLang(Detected_Cpp)
{ fileMapping.setAutoDelete(TRUE); }
int getCurrentTokenLine();
CXIndex index;
......@@ -56,6 +58,7 @@ class ClangParser::Private
QCString *sources;
uint numFiles;
QDict<uint> fileMapping;
DetectedLang detectedLang;
};
static QCString detab(const QCString &s)
......@@ -112,28 +115,6 @@ static QCString detab(const QCString &s)
return out.get();
}
static QStrList getClangOptions()
{
static QCString clangOptions = Config_getString("CLANG_OPTIONS");
int p=0,i;
QStrList options;
while ((i=clangOptions.find(' ',p))!=-1)
{
QCString opt = clangOptions.mid(p,i-p).stripWhiteSpace();
if (!opt.isEmpty())
{
options.append(opt);
}
p=i+1;
}
QCString opt = clangOptions.right(clangOptions.length()-p).stripWhiteSpace();
if (!opt.isEmpty())
{
options.append(opt);
}
return options;
}
/** Callback function called for each include in a translation unit */
static void inclusionVisitor(CXFile includedFile,
CXSourceLocation* /*inclusionStack*/,
......@@ -177,7 +158,7 @@ void ClangParser::start(const char *fileName,QStrList &filesInTranslationUnit)
{
static bool clangAssistedParsing = Config_getBool("CLANG_ASSISTED_PARSING");
static QStrList &includePath = Config_getList("INCLUDE_PATH");
static QStrList clangOptions = getClangOptions();
static QStrList clangOptions = Config_getList("CLANG_OPTIONS");
if (!clangAssistedParsing) return;
//printf("ClangParser::start(%s)\n",fileName);
p->fileName = fileName;
......@@ -207,8 +188,43 @@ void ClangParser::start(const char *fileName,QStrList &filesInTranslationUnit)
}
// extra options
argv[argc++]=strdup("-ferror-limit=0");
argv[argc++]=strdup("-x"); // force C++
argv[argc++]=strdup("c++");
argv[argc++]=strdup("-x");
// Since we can be presented with a .h file that can contain C/C++ or
// Objective C code and we need to configure the parser before knowing this,
// we use the source file to detected the language. Detection will fail if you
// pass a bunch of .h files containing ObjC code, and no sources :-(
SrcLangExt lang = getLanguageFromFileName(fileName);
if (lang==SrcLangExt_ObjC || p->detectedLang!=ClangParser::Private::Detected_Cpp)
{
QCString fn = fileName;
if (p->detectedLang==ClangParser::Private::Detected_Cpp &&
(fn.right(4).lower()==".cpp" || fn.right(4).lower()==".cxx" ||
fn.right(3).lower()==".cc" || fn.right(2).lower()==".c"))
{ // fall back to C/C++ once we see an extension that indicates this
p->detectedLang = ClangParser::Private::Detected_Cpp;
}
else if (fn.right(3).lower()==".mm") // switch to Objective C++
{
p->detectedLang = ClangParser::Private::Detected_ObjCpp;
}
else if (fn.right(2).lower()==".m") // switch to Objective C
{
p->detectedLang = ClangParser::Private::Detected_ObjC;
}
}
switch(p->detectedLang)
{
case ClangParser::Private::Detected_Cpp:
argv[argc++]=strdup("c++");
break;
case ClangParser::Private::Detected_ObjC:
argv[argc++]=strdup("objective-c");
break;
case ClangParser::Private::Detected_ObjCpp:
argv[argc++]=strdup("objective-c++");
break;
}
// provide the input and and its dependencies as unsaved files so we can
// pass the filtered versions
......
......@@ -871,7 +871,7 @@ DOCNL "\n"|"\\_linebr"
LC "\\"{B}*"\n"
NW [^a-z_A-Z0-9]
FILESCHAR [a-z_A-Z0-9\x80-\xFF\\:\\\/\-\+@&#]
FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+]
FILEECHAR [a-z_A-Z0-9\x80-\xFF\-\+@&#]
FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]*"\"")
ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]*
......@@ -2528,6 +2528,11 @@ static bool handleEndIf(const QCString &)
delete guards.pop();
}
enabledSectionFound=FALSE;
if (g_spaceBeforeCmd)
{
addOutput(' ');
g_spaceBeforeCmd=FALSE;
}
BEGIN( GuardParamEnd );
return FALSE;
}
......
......@@ -1113,7 +1113,7 @@ void Config::check()
if (paperType!="a4" && paperType!="a4wide" && paperType!="letter" &&
paperType!="legal" && paperType!="executive")
{
config_err("Error: Unknown page type specified");
config_err("Error: Unknown page type specified\n");
}
QCString &outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
......@@ -1261,7 +1261,8 @@ void Config::check()
if (dotFontName=="FreeSans" || dotFontName=="FreeSans.ttf")
{
config_err("Warning: doxygen no longer ships with the FreeSans font.\n"
"You may want to clear DOT_FONTPATH or risk wrong fonts being used for dot generated graphs.\n");
"You may want to clear or change DOT_FONTPATH.\n"
"Otherwise you run the risk that the wrong font is being used for dot generated graphs.\n");
}
......
......@@ -344,7 +344,7 @@ symbols.
If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
documentation are documented, even if no documentation was available.
Private class members and static file members will be hidden unless
the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
the EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES
' defval='0'/>
<option type='bool' id='EXTRACT_PRIVATE' docs='
If the EXTRACT_PRIVATE tag is set to YES all private members of a class
......@@ -800,14 +800,14 @@ which an include is specified. Set to NO to disable this.
' defval='1'/>
<option type='bool' id='CLANG_ASSISTED_PARSING' setting='USE_LIBCLANG' docs='
If CLANG_ASSISTED_PARSING is set to YES, then doxygen will use the clang parser
for better parsing at the cost of reduced performance. This can be particularly
helpful with template rich C++ code for which doxygen&apos;s built-in
for more acurate parsing at the cost of reduced performance. This can be
particularly helpful with template rich C++ code for which doxygen&apos;s built-in
parser lacks the necessairy type information.
' defval='0'/>
<option type='string' id='CLANG_OPTIONS' setting='USE_LIBCLANG' docs='
<option type='list' id='CLANG_OPTIONS' setting='USE_LIBCLANG' docs='
If clang assisted parsing is enabled you can provide the compiler with command
line options that you would normally use when invoking the compiler. Note that
the include paths will be set by doxygen based on the files and directory
the include paths will already be set by doxygen for the files and directories
specified at INPUT and INCLUDE_PATH.
' defval='' depends='CLANG_ASSISTED_PARSING'/>
</group>
......@@ -821,13 +821,13 @@ contains a lot of classes, structs, unions or interfaces.
If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
in which this list will be split (can be a number in the range [1..20])
' minval='1' maxval='20' defval='5'/>
' minval='1' maxval='20' defval='5' depends='ALPHABETICAL_INDEX'/>
<option type='list' id='IGNORE_PREFIX' format='string' docs='
In case all classes in a project start with a common prefix, all
classes will be put under the same header in the alphabetical index.
The IGNORE_PREFIX tag can be used to specify one or more prefixes that
should be ignored while generating the index headers.
'>
' depends='ALPHABETICAL_INDEX'>
</option>
</group>
<group name='HTML' docs='configuration options related to the HTML output'>
......@@ -1112,13 +1112,13 @@ rendering instead of using prerendered bitmaps. Use this if you do not
have LaTeX installed or if you want to formulas look prettier in the HTML
output. When enabled you may also need to install MathJax separately and
configure the path to it using the MATHJAX_RELPATH option.
' defval='0'/>
' defval='0' depends='GENERATE_HTML'/>
<option type='enum' id='MATHJAX_FORMAT' defval='HTML-CSS' docs='
When MathJax is enabled you can set the default output format to be used for
the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and
SVG. The default value is HTML-CSS, which is slower, but has the best
compatibility.
'>
' depends='USE_MATHJAX'>
<value name="HTML-CSS"/>
<value name="NativeMML"/>
<value name="SVG"/>
......@@ -1132,7 +1132,7 @@ MATHJAX_RELPATH should be ../mathjax. The default value points to
the MathJax Content Delivery Network so you can quickly see the result without
installing MathJax. However, it is strongly recommended to install a local
copy of MathJax from http://www.mathjax.org before deployment.
' defval='http://cdn.mathjax.org/mathjax/latest'/>
' defval='http://cdn.mathjax.org/mathjax/latest' depends='USE_MATHJAX'/>
<option type='list' id='MATHJAX_EXTENSIONS' format='string' docs='
The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension
names that should be enabled during MathJax rendering.
......@@ -1187,7 +1187,7 @@ When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the
EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
projects and redirect the results back to the right project.
' defval='' dependes='SEARCHENGINE'/>
' defval='' depends='SEARCHENGINE'/>
<option type='list' id='EXTRA_SEARCH_MAPPINGS' docs='
The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
projects other than the one defined by this configuration file, but that are
......@@ -1227,10 +1227,9 @@ save some trees in general.
<option type='enum' id='PAPER_TYPE' defval='a4' docs='
The PAPER_TYPE tag can be used to set the paper type that is used
by the printer. Possible values are: a4, letter, legal and
executive. If left blank a4wide will be used.
executive. If left blank a4 will be used.
' depends='GENERATE_LATEX'>
<value name='a4'/>
<value name='a4wide'/>
<value name='letter'/>
<value name='legal'/>
<value name='executive'/>
......@@ -1460,7 +1459,7 @@ pointed to by INCLUDE_PATH will be searched when a #include is found.
The INCLUDE_PATH tag can be used to specify one or more directories that
contain include files that are not input files but should be processed by
the preprocessor.
' depends='ENABLE_PREPROCESSING'>
' depends='SEARCH_INCLUDES'>
</option>
<option type='list' id='INCLUDE_FILE_PATTERNS' format='string' docs='
You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
......@@ -1565,7 +1564,7 @@ allowed to run in parallel. When set to 0 (the default) doxygen will
base this on the number of processors available in the system. You can set it
explicitly to a value larger than 0 to get control over the balance
between CPU load and processing speed.
' defval='0' minval='0' maxval='32' dependes='HAVE_DOT'/>
' defval='0' minval='0' maxval='32' depends='HAVE_DOT'/>
<option type='string' id='DOT_FONTNAME' format='string' docs='
By default doxygen will use the Helvetica font for all dot files that
doxygen generates. When you want a differently looking font you can specify
......
......@@ -484,7 +484,7 @@ void addConfigOptions(Config *cfg)
"If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in\n"
"documentation are documented, even if no documentation was available.\n"
"Private class members and static file members will be hidden unless\n"
"the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES",
"the EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES",
FALSE
);
//----
......@@ -1138,8 +1138,8 @@ void addConfigOptions(Config *cfg)
cb = cfg->addBool(
"CLANG_ASSISTED_PARSING",
"If CLANG_ASSISTED_PARSING is set to YES, then doxygen will use the clang parser\n"
"for better parsing at the cost of reduced performance. This can be particularly\n"
"helpful with template rich C++ code for which doxygen's built-in\n"
"for more acurate parsing at the cost of reduced performance. This can be\n"
"particularly helpful with template rich C++ code for which doxygen's built-in\n"
"parser lacks the necessairy type information.",
FALSE
);
......@@ -1148,14 +1148,14 @@ void addConfigOptions(Config *cfg)
#endif
#if USE_LIBCLANG
//----
cs = cfg->addString(
cl = cfg->addList(
"CLANG_OPTIONS",
"If clang assisted parsing is enabled you can provide the compiler with command\n"
"line options that you would normally use when invoking the compiler. Note that\n"
"the include paths will be set by doxygen based on the files and directory\n"
"the include paths will already be set by doxygen for the files and directories\n"
"specified at INPUT and INCLUDE_PATH."
);
cs->addDependency("CLANG_ASSISTED_PARSING");
cl->addDependency("CLANG_ASSISTED_PARSING");
#else
cfg->addDisabled("CLANG_OPTIONS");
#endif
......@@ -1179,6 +1179,7 @@ void addConfigOptions(Config *cfg)
"in which this list will be split (can be a number in the range [1..20])",
1,20,5
);
ci->addDependency("ALPHABETICAL_INDEX");
//----
cl = cfg->addList(
"IGNORE_PREFIX",
......@@ -1187,6 +1188,7 @@ void addConfigOptions(Config *cfg)
"The IGNORE_PREFIX tag can be used to specify one or more prefixes that\n"
"should be ignored while generating the index headers."
);
cl->addDependency("ALPHABETICAL_INDEX");
//---------------------------------------------------------------------------
cfg->addInfo("HTML","configuration options related to the HTML output");
//---------------------------------------------------------------------------
......@@ -1644,6 +1646,7 @@ void addConfigOptions(Config *cfg)
"configure the path to it using the MATHJAX_RELPATH option.",
FALSE
);
cb->addDependency("GENERATE_HTML");
//----
ce = cfg->addEnum(
"MATHJAX_FORMAT",
......@@ -1656,6 +1659,7 @@ void addConfigOptions(Config *cfg)
ce->addValue("HTML-CSS");
ce->addValue("NativeMML");
ce->addValue("SVG");
ce->addDependency("USE_MATHJAX");
//----
cs = cfg->addString(
"MATHJAX_RELPATH",
......@@ -1670,6 +1674,7 @@ void addConfigOptions(Config *cfg)
"copy of MathJax from http://www.mathjax.org before deployment."
);
cs->setDefaultValue("http://cdn.mathjax.org/mathjax/latest");
cs->addDependency("USE_MATHJAX");
//----
cl = cfg->addList(
"MATHJAX_EXTENSIONS",
......@@ -1751,6 +1756,7 @@ void addConfigOptions(Config *cfg)
"useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple\n"
"projects and redirect the results back to the right project."
);
cs->addDependency("SEARCHENGINE");
//----
cl = cfg->addList(
"EXTRA_SEARCH_MAPPINGS",
......@@ -1819,11 +1825,10 @@ void addConfigOptions(Config *cfg)
"PAPER_TYPE",
"The PAPER_TYPE tag can be used to set the paper type that is used\n"
"by the printer. Possible values are: a4, letter, legal and\n"
"executive. If left blank a4wide will be used.",
"executive. If left blank a4 will be used.",
"a4"
);
ce->addValue("a4");
ce->addValue("a4wide");
ce->addValue("letter");
ce->addValue("legal");
ce->addValue("executive");
......@@ -2196,7 +2201,7 @@ void addConfigOptions(Config *cfg)
"contain include files that are not input files but should be processed by\n"
"the preprocessor."
);
cl->addDependency("ENABLE_PREPROCESSING");
cl->addDependency("SEARCH_INCLUDES");
cl->setWidgetType(ConfigList::Dir);
//----
cl = cfg->addList(
......@@ -2350,6 +2355,7 @@ void addConfigOptions(Config *cfg)
"between CPU load and processing speed.",
0,32,0
);
ci->addDependency("HAVE_DOT");
//----
cs = cfg->addString(
"DOT_FONTNAME",
......
......@@ -4403,10 +4403,6 @@ int DocAutoListItem::parse()
int retval = RetVal_OK;
g_nodeStack.push(this);
//retval=m_paragraph->parse();
//m_paragraph->markFirst();
//m_paragraph->markLast();
// first parse any number of paragraphs
bool isFirst=TRUE;
DocPara *lastPar=0;
......
......@@ -338,7 +338,7 @@ ATTRIB {ATTRNAME}{WS}*("="{WS}*(("\""[^\"]*"\"")|("'"[^\']*"'")|[^ \t\r\n'"><
URLCHAR [a-z_A-Z0-9\!\~\,\:\;\'\$\?\@\&\%\#\.\-\+\/\=]
URLMASK ({URLCHAR}+([({]{URLCHAR}*[)}])?)+
FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+@&#]
FILEECHAR [a-z_A-Z0-9\-\+]
FILEECHAR [a-z_A-Z0-9\-\+@&#]
HFILEMASK ("."{FILESCHAR}*{FILEECHAR}+)*
FILEMASK ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|{HFILEMASK}
LINKMASK [^ \t\n\r\\@<&${}]+("("[^\n)]*")")?({BLANK}*("const"|"volatile"){BLANK}+)?
......@@ -690,34 +690,37 @@ REFWORD {LABELID}|{REFWORD2}|{REFWORD3}
g_token->name = yytext;
return TK_COMMAND;
}
<St_Para>({BLANK}*\n)+{BLANK}*\n/{LISTITEM} { /* skip trailing paragraph followed by new list item */
if (g_insidePre)
{
REJECT;
}
}
<St_Para>({BLANK}*\n)+{BLANK}*\n/{MLISTITEM} { /* skip trailing paragraph followed by new list item */
if (!Doxygen::markdownSupport || g_insidePre)
{
REJECT;
}
}
<St_Para>({BLANK}*\n)+{BLANK}*\n/{OLISTITEM} { /* skip trailing paragraph followed by new list item */
if (!Doxygen::markdownSupport || g_insidePre)
{
REJECT;
}
}
<St_Para>({BLANK}*\n)+{BLANK}*\n{BLANK}* {
// g_insidePre was always FALSE, so the next section
// was never executed, now g_insidePre is set properly
// again, so the section is commented out to keep the
// old behavior.
//if (g_insidePre)
//{
// /* Inside a <pre>..</pre> blank lines are treated
// * as whitespace.
// */
// g_token->chars=yytext;
// return TK_WHITESPACE;
//}
//else // found end of a paragraph
{
g_token->indent=computeIndent(yytext,(int)yyleng);
int i;
// put back the indentation (needed for list items)
for (i=0;i<g_token->indent;i++)
{
unput(' ');
}
// tell flex that after putting the last indent
// back we are at the beginning of the line
YY_CURRENT_BUFFER->yy_at_bol=1;
// start of a new paragraph
return TK_NEWPARA;
}
g_token->indent=computeIndent(yytext,(int)yyleng);
int i;
// put back the indentation (needed for list items)
for (i=0;i<g_token->indent;i++)
{
unput(' ');
}
// tell flex that after putting the last indent
// back we are at the beginning of the line
YY_CURRENT_BUFFER->yy_at_bol=1;
// start of a new paragraph
return TK_NEWPARA;
}
<St_CodeOpt>{BLANK}*"{"(".")?{LABELID}"}" {
g_token->name = yytext;
......
......@@ -11249,8 +11249,9 @@ void generateOutput()
if (Config_getBool("GENERATE_LEGEND"))
{
msg("Generating graph info page...\n");
g_s.begin("Generating graph info page...\n");
writeGraphInfo(*g_outputList);
g_s.end();
}
g_s.begin("Generating directory documentation...\n");
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -47,6 +47,7 @@ HEADERS = arguments.h \
doxygen.h \
doxygen_bst.h \
doxygen_css.h \
doxygen_sty.h \
eclipsehelp.h \
entry.h \
example.h \
......
......@@ -144,6 +144,9 @@ extsearch_js.h: extsearch.js
doxygen_css.h: doxygen.css
cat doxygen.css | $(TO_C_CMD) >doxygen_css.h
doxygen_sty.h: doxygen.sty
cat doxygen.sty | $(TO_C_CMD) >doxygen_sty.h
navtree_js.h: navtree.js
cat navtree.js | $(TO_C_CMD) >navtree_js.h
......
......@@ -1466,19 +1466,20 @@ int findTableColumns(const char *data,int size,int &start,int &end,int &columns)
// count columns between start and end
columns=0;
if (n==2) // table row has | ... |
{
columns++;
}
if (end>start)
{
i=start;
while (i<=end) // look for more column markers
{
if (data[i]=='|' && (i==0 || data[i-1]!='\\')) columns++;
if (columns==1) columns++; // first | make a non-table into a two column table
i++;
}
}
if (n==2 && columns==0) // table row has | ... |
{
columns++;
}
//printf("findTableColumns(start=%d,end=%d,columns=%d) eol=%d\n",
// start,end,columns,eol);
return eol;
......
......@@ -90,8 +90,9 @@ void PageDef::writeDocumentation(OutputList &ol)
static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
//outputList->disable(OutputGenerator::Man);
QCString pageName;
pageName=escapeCharsInString(name(),FALSE,TRUE);
QCString pageName,manPageName;
pageName = escapeCharsInString(name(),FALSE,TRUE);
manPageName = escapeCharsInString(name(),TRUE,TRUE);
//printf("PageDef::writeDocumentation: %s\n",getOutputFileBase().data());
......@@ -110,7 +111,15 @@ void PageDef::writeDocumentation(OutputList &ol)
ol.enable(OutputGenerator::Html);
}
ol.pushGeneratorState();
//2.{
ol.disableAllBut(OutputGenerator::Man);
startFile(ol,getOutputFileBase(),manPageName,title(),HLI_Pages,!generateTreeView);
ol.enableAll();
ol.disable(OutputGenerator::Man);
startFile(ol,getOutputFileBase(),pageName,title(),HLI_Pages,!generateTreeView);
ol.popGeneratorState();
//2.}
if (!generateTreeView)
{
......@@ -126,8 +135,8 @@ void PageDef::writeDocumentation(OutputList &ol)
ol.pushGeneratorState();
//2.{
ol.disableAllBut(OutputGenerator::Man);
ol.startTitleHead(pageName);
ol.endTitleHead(pageName, pageName);
ol.startTitleHead(manPageName);
ol.endTitleHead(manPageName, manPageName);
if (si)
{
ol.generateDoc(docFile(),docLine(),this,0,si->title,TRUE,FALSE,0,TRUE,FALSE);
......
......@@ -2522,6 +2522,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
g_ccomment=FALSE;
}
g_condCtx=YY_START;
startCondSection(" ");
BEGIN(SkipCond);
}
<SkipCond>\n { g_yyLineNr++; outputChar('\n'); }
......@@ -2940,6 +2941,7 @@ void preprocessFile(const char *fileName,BufStr &input,BufStr &output)
g_macroExpansion = Config_getBool("MACRO_EXPANSION");
g_expandOnlyPredef = Config_getBool("EXPAND_ONLY_PREDEF");
g_skip=FALSE;
g_curlyCount=0;
g_nospaces=FALSE;
g_inputBuf=&input;
......
......@@ -1119,6 +1119,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
current->type = "id";
}
current->name = yytext;
if (insideCpp || insideObjC)
{
current->id = ClangParser::instance()->lookup(yyLineNr,yytext);
}
}
<ObjCMethod>":"{B}* { // start of parameter list
current->name += ':';
......@@ -6074,6 +6078,10 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
docBlock.resize(docBlock.length() - 3);
lineCount();
}
<DocLine>{B}*"///"[/]+{B}*/"\n" { // ignore marker line (see bug700345)
handleCommentBlock(docBlock.data(),current->brief.isEmpty());
BEGIN( docBlockContext );
}
<DocLine>[^\n]*/"\n" { // whole line
docBlock+=yytext;
handleCommentBlock(docBlock.data(),current->brief.isEmpty());
......@@ -6833,7 +6841,8 @@ void CLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
bool CLanguageScanner::needsPreprocessing(const QCString &extension)
{
QCString fe=extension.lower();
return
SrcLangExt lang = getLanguageFromFileName(extension);
return (SrcLangExt_Cpp == lang) ||
!( fe==".java" || fe==".as" || fe==".d" || fe==".php" ||
fe==".php4" || fe==".inc" || fe==".phtml"
);
......
......@@ -71,7 +71,7 @@ class TranslatorArabic : public TranslatorAdapter_1_4_6
/*! return the language charset. This will be used for the HTML output */
virtual QCString idLanguageCharset()
{
return "cp1256";
return "utf-8";
}
// --- Language translation methods -------------------
......
This diff is collapsed.
......@@ -17,6 +17,7 @@
// Updates:
// --------
// 2013/05/14 - Updates for "new since 1.8.4".
// 2012/08/02 - Updates for "new since 1.8.2".
// 2012/04/18 - Updates for "new since 1.8.0".
// 2011/07/28 - Updates for "new since 1.7.5".
......@@ -31,7 +32,7 @@
#ifndef TRANSLATOR_SK_H
#define TRANSLATOR_SK_H
class TranslatorSlovak : public TranslatorAdapter_1_8_2
class TranslatorSlovak : public Translator
{
public:
// --- Language control methods -------------------
......@@ -1962,6 +1963,62 @@ class TranslatorSlovak : public TranslatorAdapter_1_8_2
return "Návrhová schéma";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.8.4
//////////////////////////////////////////////////////////////////////////
/** old style UNO IDL services: implemented interfaces */
virtual QCString trInterfaces()
{ return "Exportované rozhrania"; }
/** old style UNO IDL services: inherited services */
virtual QCString trServices()
{ return "Začlenené služby"; }
/** UNO IDL constant groups */
virtual QCString trConstantGroups()
{ return "Konštantné skupiny"; }
/** UNO IDL constant groups */
virtual QCString trConstantGroupReference(const char *namespaceName)
{
QCString result="Konštantné skupiny z ";
result += namespaceName;
return result;
}
/** UNO IDL service page title */
virtual QCString trServiceReference(const char *sName)
{
QCString result="Popis služby ";
result += sName;
return result;
}
/** UNO IDL singleton page title */
virtual QCString trSingletonReference(const char *sName)
{
QCString result="Popis singletonu ";
result += sName;
return result;
}
/** UNO IDL service page */
virtual QCString trServiceGeneratedFromFiles(bool single)
{
// single is true implies a single file
QCString result="Dokumentácia k tejto službe bola vygenerovaná ";
if (single) result+="z nasledujúceho súboru:";
else result+="z nasledujúcich súborov:";
return result;
}
/** UNO IDL singleton page */
virtual QCString trSingletonGeneratedFromFiles(bool single)
{
// single is true implies a single file
QCString result="Dokumentácia k tomuto singletonu bola vygenerovaná ";
if (single) result+="z nasledujúceho súboru:";
else result+="z nasledujúcich súborov:";
return result;
}
//////////////////////////////////////////////////////////////////////////
};
......
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