Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
D
doxverilog
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
doxverilog
Commits
9e1745a1
Commit
9e1745a1
authored
May 24, 2003
by
dimitri
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Release-1.3-20030524
parent
64200b5e
Changes
21
Show whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
399 additions
and
392 deletions
+399
-392
INSTALL
INSTALL
+2
-2
README
README
+2
-2
VERSION
VERSION
+1
-1
commands.doc
doc/commands.doc
+8
-4
language.doc
doc/language.doc
+13
-13
doxygen.spec
packages/rpm/doxygen.spec
+1
-1
classdef.cpp
src/classdef.cpp
+2
-2
config.l
src/config.l
+1
-1
defgen.cpp
src/defgen.cpp
+2
-2
doctokenizer.l
src/doctokenizer.l
+1
-1
dot.cpp
src/dot.cpp
+71
-50
dot.h
src/dot.h
+31
-27
doxygen.cpp
src/doxygen.cpp
+10
-3
htmlgen.cpp
src/htmlgen.cpp
+117
-202
memberdef.cpp
src/memberdef.cpp
+28
-25
pre.l
src/pre.l
+1
-1
scanner.l
src/scanner.l
+1
-0
translator_hr.h
src/translator_hr.h
+45
-3
util.cpp
src/util.cpp
+49
-37
util.h
src/util.h
+1
-1
xmlgen.cpp
src/xmlgen.cpp
+12
-14
No files found.
INSTALL
View file @
9e1745a1
DOXYGEN Version 1.3-200305
1
4
DOXYGEN Version 1.3-200305
2
4
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 (
1
4 May 2003)
Dimitri van Heesch (
2
4 May 2003)
README
View file @
9e1745a1
DOXYGEN Version 1.3_200305
1
4
DOXYGEN Version 1.3_200305
2
4
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) (
1
4 May 2003)
Dimitri van Heesch (dimitri@stack.nl) (
2
4 May 2003)
VERSION
View file @
9e1745a1
1.3-200305
1
4
1.3-200305
2
4
doc/commands.doc
View file @
9e1745a1
...
@@ -1439,10 +1439,14 @@ ALIASES = "english=\if english" \
...
@@ -1439,10 +1439,14 @@ ALIASES = "english=\if english" \
duplicated or it can be used to extend the documentation of an inherited
duplicated or it can be used to extend the documentation of an inherited
member.
member.
The link object can point to a member, a class, a namespace, a group,
The link object can point to a member (of a class, file or group),
a page, or a file (checked in that order). To copy the
a class, a namespace, a group, a page, or a file (checked in that order).
documentation for a member of a class for instance one can put the
Note that if the object pointed to is a member (function, variable,
following in the documentation
typedef, etc), the compound (class, file, or group) containing it
should also be documented for the copying to work.
To copy the documentation for a member of a
class for instance one can put the following in the documentation
\verbatim
\verbatim
/*! @copydoc MyClass::myfunction()
/*! @copydoc MyClass::myfunction()
...
...
doc/language.doc
View file @
9e1745a1
...
@@ -25,7 +25,7 @@ Doxygen has built-in support for multiple languages. This means
...
@@ -25,7 +25,7 @@ Doxygen has built-in support for multiple languages. This means
that the text fragments that doxygen generates can be produced in
that the text fragments that doxygen generates can be produced in
languages other than English (the default) at configuration time.
languages other than English (the default) at configuration time.
Currently (version 1.
2.14-20020317
), 28 languages
Currently (version 1.
3-20030430
), 28 languages
are supported (sorted alphabetically):
are supported (sorted alphabetically):
Brazilian Portuguese, Catalan, Chinese, Chinese Traditional, Croatian,
Brazilian Portuguese, Catalan, Chinese, Chinese Traditional, Croatian,
Czech, Danish, Dutch, English, Finnish,
Czech, Danish, Dutch, English, Finnish,
...
@@ -55,7 +55,7 @@ when the translator was updated.
...
@@ -55,7 +55,7 @@ when the translator was updated.
<TD>Brazilian Portuguese</TD>
<TD>Brazilian Portuguese</TD>
<TD>Fabio "FJTC" Jun Takada Chino</TD>
<TD>Fabio "FJTC" Jun Takada Chino</TD>
<TD>chino@NOSPAM.icmc.sc.usp.br</TD>
<TD>chino@NOSPAM.icmc.sc.usp.br</TD>
<TD>
strang
e</TD>
<TD>
up-to-dat
e</TD>
</TR>
</TR>
<TR BGCOLOR="#ffffff">
<TR BGCOLOR="#ffffff">
<TD>Catalan</TD>
<TD>Catalan</TD>
...
@@ -79,13 +79,13 @@ when the translator was updated.
...
@@ -79,13 +79,13 @@ when the translator was updated.
<TD>Croatian</TD>
<TD>Croatian</TD>
<TD>Boris Bralo</TD>
<TD>Boris Bralo</TD>
<TD>boris.bralo@NOSPAM.zg.tel.hr</TD>
<TD>boris.bralo@NOSPAM.zg.tel.hr</TD>
<TD>
strang
e</TD>
<TD>
up-to-dat
e</TD>
</TR>
</TR>
<TR BGCOLOR="#ffffff">
<TR BGCOLOR="#ffffff">
<TD>Czech</TD>
<TD>Czech</TD>
<TD>Petr Přikryl</TD>
<TD>Petr Přikryl</TD>
<TD>prikrylp@NOSPAM.skil.cz</TD>
<TD>prikrylp@NOSPAM.skil.cz</TD>
<TD>
strang
e</TD>
<TD>
up-to-dat
e</TD>
</TR>
</TR>
<TR BGCOLOR="#ffffff">
<TR BGCOLOR="#ffffff">
<TD>Danish</TD>
<TD>Danish</TD>
...
@@ -115,13 +115,13 @@ when the translator was updated.
...
@@ -115,13 +115,13 @@ when the translator was updated.
<TD>French</TD>
<TD>French</TD>
<TD>Xavier Outhier</TD>
<TD>Xavier Outhier</TD>
<TD>xouthier@NOSPAM.yahoo.fr</TD>
<TD>xouthier@NOSPAM.yahoo.fr</TD>
<TD>
strang
e</TD>
<TD>
up-to-dat
e</TD>
</TR>
</TR>
<TR BGCOLOR="#ffffff">
<TR BGCOLOR="#ffffff">
<TD>German</TD>
<TD>German</TD>
<TD>Jens Seidel</TD>
<TD>Jens Seidel</TD>
<TD>jensseidel@NOSPAM.users.sf.net</TD>
<TD>jensseidel@NOSPAM.users.sf.net</TD>
<TD>
strang
e</TD>
<TD>
up-to-dat
e</TD>
</TR>
</TR>
<TR BGCOLOR="#ffffff">
<TR BGCOLOR="#ffffff">
<TD>Greek</TD>
<TD>Greek</TD>
...
@@ -139,7 +139,7 @@ when the translator was updated.
...
@@ -139,7 +139,7 @@ when the translator was updated.
<TD>Italian</TD>
<TD>Italian</TD>
<TD>Alessandro Falappa<br>Ahmed Aldo Faisal</TD>
<TD>Alessandro Falappa<br>Ahmed Aldo Faisal</TD>
<TD>alessandro@NOSPAM.falappa.net<br>aaf23@NOSPAM.cam.ac.uk</TD>
<TD>alessandro@NOSPAM.falappa.net<br>aaf23@NOSPAM.cam.ac.uk</TD>
<TD>
strang
e</TD>
<TD>
up-to-dat
e</TD>
</TR>
</TR>
<TR BGCOLOR="#ffffff">
<TR BGCOLOR="#ffffff">
<TD>Japanese</TD>
<TD>Japanese</TD>
...
@@ -230,7 +230,7 @@ when the translator was updated.
...
@@ -230,7 +230,7 @@ when the translator was updated.
{\bf Language} & {\bf Maintainer} & {\bf Contact address} & {\bf Status} \\
{\bf Language} & {\bf Maintainer} & {\bf Contact address} & {\bf Status} \\
\hline
\hline
\hline
\hline
Brazilian Portuguese & Fabio "FJTC" Jun Takada Chino & {\tt chino@icmc.sc.usp.br} &
strang
e \\
Brazilian Portuguese & Fabio "FJTC" Jun Takada Chino & {\tt chino@icmc.sc.usp.br} &
up-to-dat
e \\
\hline
\hline
Catalan & Albert Mora & {\tt amora@iua.upf.es} & 1.2.17 \\
Catalan & Albert Mora & {\tt amora@iua.upf.es} & 1.2.17 \\
\hline
\hline
...
@@ -239,9 +239,9 @@ when the translator was updated.
...
@@ -239,9 +239,9 @@ when the translator was updated.
\hline
\hline
Chinese Traditional & Gary Lee & {\tt garylee@ecosine.com.tw} & 1.2.16 \\
Chinese Traditional & Gary Lee & {\tt garylee@ecosine.com.tw} & 1.2.16 \\
\hline
\hline
Croatian & Boris Bralo & {\tt boris.bralo@zg.tel.hr} &
strang
e \\
Croatian & Boris Bralo & {\tt boris.bralo@zg.tel.hr} &
up-to-dat
e \\
\hline
\hline
Czech & Petr P\v{r}ikryl & {\tt prikrylp@skil.cz} &
strang
e \\
Czech & Petr P\v{r}ikryl & {\tt prikrylp@skil.cz} &
up-to-dat
e \\
\hline
\hline
Danish & Erik S\o{}e S\o{}rensen & {\tt erik@mail.nu} & strange \\
Danish & Erik S\o{}e S\o{}rensen & {\tt erik@mail.nu} & strange \\
\hline
\hline
...
@@ -251,15 +251,15 @@ when the translator was updated.
...
@@ -251,15 +251,15 @@ when the translator was updated.
\hline
\hline
Finnish & Olli Korhonen & {\tt Olli.Korhonen@ccc.fi} & obsolete \\
Finnish & Olli Korhonen & {\tt Olli.Korhonen@ccc.fi} & obsolete \\
\hline
\hline
French & Xavier Outhier & {\tt xouthier@yahoo.fr} &
strang
e \\
French & Xavier Outhier & {\tt xouthier@yahoo.fr} &
up-to-dat
e \\
\hline
\hline
German & Jens Seidel & {\tt jensseidel@users.sf.net} &
strang
e \\
German & Jens Seidel & {\tt jensseidel@users.sf.net} &
up-to-dat
e \\
\hline
\hline
Greek & Harry Kalogirou & {\tt harkal@rainbow.cs.unipi.gr} & 1.2.11 \\
Greek & Harry Kalogirou & {\tt harkal@rainbow.cs.unipi.gr} & 1.2.11 \\
\hline
\hline
Hungarian & F\"{o}ldv\'{a}ri Gy\"{o}rgy & {\tt foldvari@diatronltd.com} & 1.2.1 \\
Hungarian & F\"{o}ldv\'{a}ri Gy\"{o}rgy & {\tt foldvari@diatronltd.com} & 1.2.1 \\
\hline
\hline
Italian & Alessandro Falappa & {\tt alessandro@falappa.net} &
strang
e \\
Italian & Alessandro Falappa & {\tt alessandro@falappa.net} &
up-to-dat
e \\
& Ahmed Aldo Faisal & {\tt aaf23@cam.ac.uk} & \\
& Ahmed Aldo Faisal & {\tt aaf23@cam.ac.uk} & \\
\hline
\hline
Japanese & Ryunosuke Satoh & {\tt sun594@hotmail.com} & strange \\
Japanese & Ryunosuke Satoh & {\tt sun594@hotmail.com} & strange \\
...
...
packages/rpm/doxygen.spec
View file @
9e1745a1
Summary: A documentation system for C/C++.
Summary: A documentation system for C/C++.
Name: doxygen
Name: doxygen
Version: 1.3_200305
1
4
Version: 1.3_200305
2
4
Release: 1
Release: 1
Epoch: 1
Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
...
...
src/classdef.cpp
View file @
9e1745a1
...
@@ -1057,7 +1057,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
...
@@ -1057,7 +1057,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
if
(
Config_getBool
(
"HAVE_DOT"
)
&&
Config_getBool
(
"CLASS_GRAPH"
))
if
(
Config_getBool
(
"HAVE_DOT"
)
&&
Config_getBool
(
"CLASS_GRAPH"
))
// write class diagram using dot
// write class diagram using dot
{
{
DotClassGraph
inheritanceGraph
(
this
,
Dot
ClassGraph
::
Inheritance
,
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
));
DotClassGraph
inheritanceGraph
(
this
,
Dot
Node
::
Inheritance
,
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
));
if
(
!
inheritanceGraph
.
isTrivial
())
if
(
!
inheritanceGraph
.
isTrivial
())
{
{
ol
.
pushGeneratorState
();
ol
.
pushGeneratorState
();
...
@@ -1092,7 +1092,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
...
@@ -1092,7 +1092,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
if
(
Config_getBool
(
"HAVE_DOT"
)
&&
Config_getBool
(
"COLLABORATION_GRAPH"
))
if
(
Config_getBool
(
"HAVE_DOT"
)
&&
Config_getBool
(
"COLLABORATION_GRAPH"
))
{
{
DotClassGraph
usageImplGraph
(
this
,
Dot
ClassGraph
::
Implement
ation
,
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
));
DotClassGraph
usageImplGraph
(
this
,
Dot
Node
::
Collabor
ation
,
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
));
if
(
!
usageImplGraph
.
isTrivial
())
if
(
!
usageImplGraph
.
isTrivial
())
{
{
ol
.
pushGeneratorState
();
ol
.
pushGeneratorState
();
...
...
src/config.l
View file @
9e1745a1
...
@@ -2474,7 +2474,7 @@ void Config::create()
...
@@ -2474,7 +2474,7 @@ void Config::create()
"TEMPLATE_RELATIONS",
"TEMPLATE_RELATIONS",
"If set to YES, the inheritance and collaboration graphs will show the \n"
"If set to YES, the inheritance and collaboration graphs will show the \n"
"relations between templates and their instances. \n",
"relations between templates and their instances. \n",
TRU
E
FALS
E
);
);
cb->addDependency("HAVE_DOT");
cb->addDependency("HAVE_DOT");
cb = addBool(
cb = addBool(
...
...
src/defgen.cpp
View file @
9e1745a1
...
@@ -453,7 +453,7 @@ void generateDEFForClass(ClassDef *cd,QTextStream &t)
...
@@ -453,7 +453,7 @@ void generateDEFForClass(ClassDef *cd,QTextStream &t)
t
<<
" cp-documentation = <<_EnD_oF_dEf_TeXt_"
<<
endl
t
<<
" cp-documentation = <<_EnD_oF_dEf_TeXt_"
<<
endl
<<
cd
->
documentation
()
<<
endl
<<
"_EnD_oF_dEf_TeXt_;"
<<
endl
;
<<
cd
->
documentation
()
<<
endl
<<
"_EnD_oF_dEf_TeXt_;"
<<
endl
;
DotClassGraph
inheritanceGraph
(
cd
,
Dot
ClassGraph
::
Inheritance
,
DotClassGraph
inheritanceGraph
(
cd
,
Dot
Node
::
Inheritance
,
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
));
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
));
if
(
!
inheritanceGraph
.
isTrivial
())
if
(
!
inheritanceGraph
.
isTrivial
())
{
{
...
@@ -461,7 +461,7 @@ void generateDEFForClass(ClassDef *cd,QTextStream &t)
...
@@ -461,7 +461,7 @@ void generateDEFForClass(ClassDef *cd,QTextStream &t)
inheritanceGraph
.
writeDEF
(
t
);
inheritanceGraph
.
writeDEF
(
t
);
t
<<
endl
<<
"_EnD_oF_dEf_TeXt_;"
<<
endl
;
t
<<
endl
<<
"_EnD_oF_dEf_TeXt_;"
<<
endl
;
}
}
DotClassGraph
collaborationGraph
(
cd
,
Dot
ClassGraph
::
Implement
ation
,
DotClassGraph
collaborationGraph
(
cd
,
Dot
Node
::
Collabor
ation
,
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
));
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
));
if
(
!
collaborationGraph
.
isTrivial
())
if
(
!
collaborationGraph
.
isTrivial
())
{
{
...
...
src/doctokenizer.l
View file @
9e1745a1
...
@@ -279,7 +279,7 @@ OPNEW {BLANK}+"new"({BLANK}*"[]")?
...
@@ -279,7 +279,7 @@ OPNEW {BLANK}+"new"({BLANK}*"[]")?
OPDEL {BLANK}+"delete"({BLANK}*"[]")?
OPDEL {BLANK}+"delete"({BLANK}*"[]")?
OPNORM {OPNEW}|{OPDEL}|"+"|"-"|"*"|"/"|"%"|"^"|"&"|"|"|"~"|"!"|"="|"<"|">"|"+="|"-="|"*="|"/="|"%="|"^="|"&="|"|="|"<<"|">>"|"<<="|">>="|"=="|"!="|"<="|">="|"&&"|"||"|"++"|"--"|","|"->*"|"->"|"[]"|"()"
OPNORM {OPNEW}|{OPDEL}|"+"|"-"|"*"|"/"|"%"|"^"|"&"|"|"|"~"|"!"|"="|"<"|">"|"+="|"-="|"*="|"/="|"%="|"^="|"&="|"|="|"<<"|">>"|"<<="|">>="|"=="|"!="|"<="|">="|"&&"|"||"|"++"|"--"|","|"->*"|"->"|"[]"|"()"
OPCAST {BLANK}+[^(\r\n.,]+
OPCAST {BLANK}+[^(\r\n.,]+
OPMASK ({BLANK}*{OPNORM}
({FUNCARG}?)
)|({OPCAST}{FUNCARG})
OPMASK ({BLANK}*{OPNORM}
{FUNCARG}
)|({OPCAST}{FUNCARG})
LNKWORD1 ("::"|"#")?{SCOPEMASK}
LNKWORD1 ("::"|"#")?{SCOPEMASK}
CVSPEC {BLANK}*("const"|"volatile")
CVSPEC {BLANK}*("const"|"volatile")
LNKWORD2 {SCOPEPRE}*"operator"{OPMASK}
LNKWORD2 {SCOPEPRE}*"operator"{OPMASK}
...
...
src/dot.cpp
View file @
9e1745a1
...
@@ -294,22 +294,22 @@ static void deleteNodes(DotNode *node,SDict<DotNode> *skipNodes=0)
...
@@ -294,22 +294,22 @@ static void deleteNodes(DotNode *node,SDict<DotNode> *skipNodes=0)
deletedNodes
.
clear
();
// actually remove the nodes.
deletedNodes
.
clear
();
// actually remove the nodes.
}
}
DotNode
::
DotNode
(
int
n
,
const
char
*
lab
,
const
char
*
url
,
int
distance
,
bool
isRoot
)
DotNode
::
DotNode
(
int
n
,
const
char
*
lab
,
const
char
*
url
,
int
distance
,
:
m_number
(
n
),
m_label
(
lab
),
m_url
(
url
),
m_isRoot
(
isRoot
)
bool
isRoot
,
ClassDef
*
cd
)
:
m_number
(
n
),
m_label
(
lab
),
m_url
(
url
),
m_isRoot
(
isRoot
),
m_classDef
(
cd
)
{
{
m_children
=
0
;
m_children
=
0
;
m_edgeInfo
=
0
;
m_edgeInfo
=
0
;
m_parents
=
0
;
m_parents
=
0
;
m_subgraphId
=-
1
;
m_subgraphId
=-
1
;
m_deleted
=
FALSE
;
m_deleted
=
FALSE
;
m_written
=
FALSE
;
m_written
=
FALSE
;
m_hasDoc
=
FALSE
;
m_hasDoc
=
FALSE
;
m_distance
=
distance
;
m_distance
=
distance
;
}
}
DotNode
::~
DotNode
()
DotNode
::~
DotNode
()
{
{
//printf("DotNode::~DotNode() %s\n",m_label.data());
delete
m_children
;
delete
m_children
;
delete
m_parents
;
delete
m_parents
;
delete
m_edgeInfo
;
delete
m_edgeInfo
;
...
@@ -419,6 +419,7 @@ static QCString convertLabel(const QCString &l)
...
@@ -419,6 +419,7 @@ static QCString convertLabel(const QCString &l)
}
}
void
DotNode
::
writeBox
(
QTextStream
&
t
,
void
DotNode
::
writeBox
(
QTextStream
&
t
,
GraphType
/* gt */
,
GraphOutputFormat
/*format*/
,
GraphOutputFormat
/*format*/
,
bool
hasNonReachableChildren
)
bool
hasNonReachableChildren
)
{
{
...
@@ -444,6 +445,7 @@ void DotNode::writeBox(QTextStream &t,
...
@@ -444,6 +445,7 @@ void DotNode::writeBox(QTextStream &t,
}
}
void
DotNode
::
writeArrow
(
QTextStream
&
t
,
void
DotNode
::
writeArrow
(
QTextStream
&
t
,
GraphType
/* gt */
,
GraphOutputFormat
format
,
GraphOutputFormat
format
,
DotNode
*
cn
,
DotNode
*
cn
,
EdgeInfo
*
ei
,
EdgeInfo
*
ei
,
...
@@ -472,6 +474,7 @@ void DotNode::writeArrow(QTextStream &t,
...
@@ -472,6 +474,7 @@ void DotNode::writeArrow(QTextStream &t,
}
}
void
DotNode
::
write
(
QTextStream
&
t
,
void
DotNode
::
write
(
QTextStream
&
t
,
GraphType
gt
,
GraphOutputFormat
format
,
GraphOutputFormat
format
,
bool
topDown
,
bool
topDown
,
bool
toChildren
,
bool
toChildren
,
...
@@ -493,7 +496,7 @@ void DotNode::write(QTextStream &t,
...
@@ -493,7 +496,7 @@ void DotNode::write(QTextStream &t,
if
(
cn
->
m_distance
>
distance
)
hasNonReachableChildren
=
TRUE
;
if
(
cn
->
m_distance
>
distance
)
hasNonReachableChildren
=
TRUE
;
}
}
}
}
writeBox
(
t
,
format
,
hasNonReachableChildren
);
writeBox
(
t
,
gt
,
format
,
hasNonReachableChildren
);
m_written
=
TRUE
;
m_written
=
TRUE
;
if
(
nl
)
if
(
nl
)
{
{
...
@@ -506,9 +509,9 @@ void DotNode::write(QTextStream &t,
...
@@ -506,9 +509,9 @@ void DotNode::write(QTextStream &t,
{
{
if
(
cn
->
m_distance
<=
distance
)
if
(
cn
->
m_distance
<=
distance
)
{
{
writeArrow
(
t
,
format
,
cn
,
dnli2
.
current
(),
topDown
,
backArrows
);
writeArrow
(
t
,
gt
,
format
,
cn
,
dnli2
.
current
(),
topDown
,
backArrows
);
}
}
cn
->
write
(
t
,
format
,
topDown
,
toChildren
,
distance
,
backArrows
);
cn
->
write
(
t
,
gt
,
format
,
topDown
,
toChildren
,
distance
,
backArrows
);
}
}
}
}
else
// render parents
else
// render parents
...
@@ -520,6 +523,7 @@ void DotNode::write(QTextStream &t,
...
@@ -520,6 +523,7 @@ void DotNode::write(QTextStream &t,
if
(
pn
->
m_distance
<=
distance
)
if
(
pn
->
m_distance
<=
distance
)
{
{
writeArrow
(
t
,
writeArrow
(
t
,
gt
,
format
,
format
,
pn
,
pn
,
pn
->
m_edgeInfo
->
at
(
pn
->
m_children
->
findRef
(
this
)),
pn
->
m_edgeInfo
->
at
(
pn
->
m_children
->
findRef
(
this
)),
...
@@ -527,7 +531,7 @@ void DotNode::write(QTextStream &t,
...
@@ -527,7 +531,7 @@ void DotNode::write(QTextStream &t,
backArrows
backArrows
);
);
}
}
pn
->
write
(
t
,
format
,
TRUE
,
FALSE
,
distance
,
backArrows
);
pn
->
write
(
t
,
gt
,
format
,
TRUE
,
FALSE
,
distance
,
backArrows
);
}
}
}
}
}
}
...
@@ -809,7 +813,7 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path)
...
@@ -809,7 +813,7 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path)
for
(;(
node
=
dnli2
.
current
());
++
dnli2
)
for
(;(
node
=
dnli2
.
current
());
++
dnli2
)
{
{
if
(
node
->
m_subgraphId
==
n
->
m_subgraphId
)
if
(
node
->
m_subgraphId
==
n
->
m_subgraphId
)
node
->
write
(
t
,
BITMAP
,
FALSE
,
TRUE
,
1000
,
TRUE
);
node
->
write
(
t
,
DotNode
::
Hierarchy
,
BITMAP
,
FALSE
,
TRUE
,
1000
,
TRUE
);
}
}
writeGraphFooter
(
t
);
writeGraphFooter
(
t
);
f
.
close
();
f
.
close
();
...
@@ -1062,7 +1066,9 @@ void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot,
...
@@ -1062,7 +1066,9 @@ void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot,
bn
=
new
DotNode
(
m_curNodeNumber
++
,
bn
=
new
DotNode
(
m_curNodeNumber
++
,
displayName
,
displayName
,
tmp_url
.
data
(),
tmp_url
.
data
(),
distance
distance
,
FALSE
,
// rootNode
cd
);
);
if
(
distance
>
m_maxDistance
)
m_maxDistance
=
distance
;
if
(
distance
>
m_maxDistance
)
m_maxDistance
=
distance
;
if
(
base
)
if
(
base
)
...
@@ -1090,7 +1096,7 @@ void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base)
...
@@ -1090,7 +1096,7 @@ void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base)
// cd->name().data(),distance,base);
// cd->name().data(),distance,base);
// ---- Add inheritance relations
// ---- Add inheritance relations
if
(
m_graphType
==
Inheritance
)
if
(
m_graphType
==
DotNode
::
Inheritance
)
{
{
BaseClassListIterator
bcli
(
base
?
*
cd
->
baseClasses
()
:
*
cd
->
subClasses
());
BaseClassListIterator
bcli
(
base
?
*
cd
->
baseClasses
()
:
*
cd
->
subClasses
());
BaseClassDef
*
bcd
;
BaseClassDef
*
bcd
;
...
@@ -1104,7 +1110,7 @@ void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base)
...
@@ -1104,7 +1110,7 @@ void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base)
}
}
else
// m_graphType != Inheritance
else
// m_graphType != Inheritance
{
{
ASSERT
(
m_graphType
==
Implement
ation
);
ASSERT
(
m_graphType
==
DotNode
::
Collabor
ation
);
// ---- Add usage relations
// ---- Add usage relations
...
@@ -1187,7 +1193,7 @@ void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base)
...
@@ -1187,7 +1193,7 @@ void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base)
}
}
}
}
DotClassGraph
::
DotClassGraph
(
ClassDef
*
cd
,
GraphType
t
,
int
maxRecursionDepth
)
DotClassGraph
::
DotClassGraph
(
ClassDef
*
cd
,
DotNode
::
GraphType
t
,
int
maxRecursionDepth
)
{
{
//printf("--------------- DotClassGraph::DotClassGraph `%s'\n",cd->displayName().data());
//printf("--------------- DotClassGraph::DotClassGraph `%s'\n",cd->displayName().data());
m_graphType
=
t
;
m_graphType
=
t
;
...
@@ -1204,7 +1210,8 @@ DotClassGraph::DotClassGraph(ClassDef *cd,GraphType t,int maxRecursionDepth)
...
@@ -1204,7 +1210,8 @@ DotClassGraph::DotClassGraph(ClassDef *cd,GraphType t,int maxRecursionDepth)
className
,
className
,
tmp_url
.
data
(),
tmp_url
.
data
(),
0
,
// distance
0
,
// distance
TRUE
// is a root node
TRUE
,
// is a root node
cd
);
);
m_usedNodes
=
new
QDict
<
DotNode
>
(
1009
);
m_usedNodes
=
new
QDict
<
DotNode
>
(
1009
);
m_usedNodes
->
insert
(
className
,
m_startNode
);
m_usedNodes
->
insert
(
className
,
m_startNode
);
...
@@ -1217,14 +1224,14 @@ DotClassGraph::DotClassGraph(ClassDef *cd,GraphType t,int maxRecursionDepth)
...
@@ -1217,14 +1224,14 @@ DotClassGraph::DotClassGraph(ClassDef *cd,GraphType t,int maxRecursionDepth)
if
(
m_recDepth
>
0
)
if
(
m_recDepth
>
0
)
{
{
buildGraph
(
cd
,
m_startNode
,
1
,
TRUE
);
buildGraph
(
cd
,
m_startNode
,
1
,
TRUE
);
if
(
t
==
Inheritance
)
buildGraph
(
cd
,
m_startNode
,
1
,
FALSE
);
if
(
t
==
DotNode
::
Inheritance
)
buildGraph
(
cd
,
m_startNode
,
1
,
FALSE
);
}
}
m_diskName
=
cd
->
getFileBase
().
copy
();
m_diskName
=
cd
->
getFileBase
().
copy
();
}
}
bool
DotClassGraph
::
isTrivial
()
const
bool
DotClassGraph
::
isTrivial
()
const
{
{
if
(
m_graphType
==
Inheritance
)
if
(
m_graphType
==
DotNode
::
Inheritance
)
return
m_startNode
->
m_children
==
0
&&
m_startNode
->
m_parents
==
0
;
return
m_startNode
->
m_children
==
0
&&
m_startNode
->
m_parents
==
0
;
else
else
return
m_startNode
->
m_children
==
0
;
return
m_startNode
->
m_children
==
0
;
...
@@ -1237,6 +1244,7 @@ DotClassGraph::~DotClassGraph()
...
@@ -1237,6 +1244,7 @@ DotClassGraph::~DotClassGraph()
}
}
void
writeDotGraph
(
DotNode
*
root
,
void
writeDotGraph
(
DotNode
*
root
,
DotNode
::
GraphType
gt
,
GraphOutputFormat
format
,
GraphOutputFormat
format
,
const
QCString
&
baseName
,
const
QCString
&
baseName
,
bool
lrRank
,
bool
lrRank
,
...
@@ -1258,7 +1266,7 @@ void writeDotGraph(DotNode *root,
...
@@ -1258,7 +1266,7 @@ void writeDotGraph(DotNode *root,
t
<<
" rankdir=LR;"
<<
endl
;
t
<<
" rankdir=LR;"
<<
endl
;
}
}
root
->
clearWriteFlag
();
root
->
clearWriteFlag
();
root
->
write
(
t
,
format
,
TRUE
,
TRUE
,
distance
,
backArrows
);
root
->
write
(
t
,
gt
,
format
,
TRUE
,
TRUE
,
distance
,
backArrows
);
if
(
renderParents
&&
root
->
m_parents
)
if
(
renderParents
&&
root
->
m_parents
)
{
{
//printf("rendering parents!\n");
//printf("rendering parents!\n");
...
@@ -1269,6 +1277,7 @@ void writeDotGraph(DotNode *root,
...
@@ -1269,6 +1277,7 @@ void writeDotGraph(DotNode *root,
if
(
pn
->
m_distance
<=
distance
)
if
(
pn
->
m_distance
<=
distance
)
{
{
root
->
writeArrow
(
t
,
root
->
writeArrow
(
t
,
gt
,
format
,
format
,
pn
,
pn
,
pn
->
m_edgeInfo
->
at
(
pn
->
m_children
->
findRef
(
root
)),
pn
->
m_edgeInfo
->
at
(
pn
->
m_children
->
findRef
(
root
)),
...
@@ -1276,7 +1285,7 @@ void writeDotGraph(DotNode *root,
...
@@ -1276,7 +1285,7 @@ void writeDotGraph(DotNode *root,
backArrows
backArrows
);
);
}
}
pn
->
write
(
t
,
format
,
TRUE
,
FALSE
,
distance
,
backArrows
);
pn
->
write
(
t
,
gt
,
format
,
TRUE
,
FALSE
,
distance
,
backArrows
);
}
}
}
}
writeGraphFooter
(
t
);
writeGraphFooter
(
t
);
...
@@ -1288,6 +1297,7 @@ static void findMaximalDotGraph(DotNode *root,
...
@@ -1288,6 +1297,7 @@ static void findMaximalDotGraph(DotNode *root,
int
maxDist
,
int
maxDist
,
const
QCString
&
baseName
,
const
QCString
&
baseName
,
QDir
&
thisDir
,
QDir
&
thisDir
,
DotNode
::
GraphType
gt
,
GraphOutputFormat
format
,
GraphOutputFormat
format
,
bool
lrRank
=
FALSE
,
bool
lrRank
=
FALSE
,
bool
renderParents
=
FALSE
,
bool
renderParents
=
FALSE
,
...
@@ -1309,7 +1319,7 @@ static void findMaximalDotGraph(DotNode *root,
...
@@ -1309,7 +1319,7 @@ static void findMaximalDotGraph(DotNode *root,
{
{
curDistance
=
(
minDistance
+
maxDistance
)
/
2
;
curDistance
=
(
minDistance
+
maxDistance
)
/
2
;
writeDotGraph
(
root
,
format
,
baseName
,
lrRank
,
renderParents
,
writeDotGraph
(
root
,
gt
,
format
,
baseName
,
lrRank
,
renderParents
,
curDistance
,
backArrows
);
curDistance
,
backArrows
);
QCString
dotArgs
(
maxCmdLine
);
QCString
dotArgs
(
maxCmdLine
);
...
@@ -1347,6 +1357,7 @@ static void findMaximalDotGraph(DotNode *root,
...
@@ -1347,6 +1357,7 @@ static void findMaximalDotGraph(DotNode *root,
//printf("lastFit=%d\n",lastFit);
//printf("lastFit=%d\n",lastFit);
writeDotGraph
(
root
,
writeDotGraph
(
root
,
gt
,
format
,
format
,
baseName
,
baseName
,
lrRank
||
(
minDistance
==
1
&&
width
>
Config_getInt
(
"MAX_DOT_GRAPH_WIDTH"
)),
lrRank
||
(
minDistance
==
1
&&
width
>
Config_getInt
(
"MAX_DOT_GRAPH_WIDTH"
)),
...
@@ -1361,15 +1372,18 @@ QCString DotClassGraph::diskName() const
...
@@ -1361,15 +1372,18 @@ QCString DotClassGraph::diskName() const
QCString
result
=
m_diskName
.
copy
();
QCString
result
=
m_diskName
.
copy
();
switch
(
m_graphType
)
switch
(
m_graphType
)
{
{
case
Implement
ation
:
case
DotNode
:
:
Collabor
ation
:
result
+=
"_coll_graph"
;
result
+=
"_coll_graph"
;
break
;
break
;
case
Interface
:
//
case Interface:
result
+=
"_intf_graph"
;
//
result+="_intf_graph";
break
;
//
break;
case
Inheritance
:
case
DotNode
:
:
Inheritance
:
result
+=
"_inherit_graph"
;
result
+=
"_inherit_graph"
;
break
;
break
;
default
:
ASSERT
(
0
);
break
;
}
}
return
result
;
return
result
;
}
}
...
@@ -1395,20 +1409,23 @@ QCString DotClassGraph::writeGraph(QTextStream &out,
...
@@ -1395,20 +1409,23 @@ QCString DotClassGraph::writeGraph(QTextStream &out,
QCString
mapName
;
QCString
mapName
;
switch
(
m_graphType
)
switch
(
m_graphType
)
{
{
case
Implement
ation
:
case
DotNode
:
:
Collabor
ation
:
mapName
=
"coll_map"
;
mapName
=
"coll_map"
;
break
;
break
;
case
Interface
:
//
case Interface:
mapName
=
"intf_map"
;
//
mapName="intf_map";
break
;
//
break;
case
Inheritance
:
case
DotNode
:
:
Inheritance
:
mapName
=
"inherit_map"
;
mapName
=
"inherit_map"
;
break
;
break
;
default
:
ASSERT
(
0
);
break
;
}
}
baseName
=
convertNameToFile
(
diskName
());
baseName
=
convertNameToFile
(
diskName
());
findMaximalDotGraph
(
m_startNode
,
QMIN
(
m_recDepth
,
m_maxDistance
),
baseName
,
findMaximalDotGraph
(
m_startNode
,
QMIN
(
m_recDepth
,
m_maxDistance
),
baseName
,
thisDir
,
format
,
!
isTBRank
,
m_graphType
==
Inheritance
);
thisDir
,
m_graphType
,
format
,
!
isTBRank
,
m_graphType
==
DotNode
::
Inheritance
);
if
(
format
==
BITMAP
)
// run dot to create a bitmap image
if
(
format
==
BITMAP
)
// run dot to create a bitmap image
{
{
...
@@ -1440,15 +1457,18 @@ QCString DotClassGraph::writeGraph(QTextStream &out,
...
@@ -1440,15 +1457,18 @@ QCString DotClassGraph::writeGraph(QTextStream &out,
<<
mapLabel
<<
"
\"
alt=
\"
"
;
<<
mapLabel
<<
"
\"
alt=
\"
"
;
switch
(
m_graphType
)
switch
(
m_graphType
)
{
{
case
Implement
ation
:
case
DotNode
:
:
Collabor
ation
:
out
<<
"Collaboration graph"
;
out
<<
"Collaboration graph"
;
break
;
break
;
case
Interface
:
//
case Interface:
out
<<
"Interface dependency graph"
;
//
out << "Interface dependency graph";
break
;
//
break;
case
Inheritance
:
case
DotNode
:
:
Inheritance
:
out
<<
"Inheritance graph"
;
out
<<
"Inheritance graph"
;
break
;
break
;
default
:
ASSERT
(
0
);
break
;
}
}
out
<<
"
\"
></center>"
<<
endl
;
out
<<
"
\"
></center>"
<<
endl
;
QString
tmpstr
;
QString
tmpstr
;
...
@@ -1647,7 +1667,8 @@ QCString DotInclDepGraph::writeGraph(QTextStream &out,
...
@@ -1647,7 +1667,8 @@ QCString DotInclDepGraph::writeGraph(QTextStream &out,
QCString
mapName
=
m_startNode
->
m_label
.
copy
();
QCString
mapName
=
m_startNode
->
m_label
.
copy
();
if
(
m_inverse
)
mapName
+=
"dep"
;
if
(
m_inverse
)
mapName
+=
"dep"
;
findMaximalDotGraph
(
m_startNode
,
QMIN
(
m_recDepth
,
m_maxDistance
),
baseName
,
thisDir
,
format
,
findMaximalDotGraph
(
m_startNode
,
QMIN
(
m_recDepth
,
m_maxDistance
),
baseName
,
thisDir
,
DotNode
::
Dependency
,
format
,
FALSE
,
FALSE
,
!
m_inverse
);
FALSE
,
FALSE
,
!
m_inverse
);
if
(
format
==
BITMAP
)
if
(
format
==
BITMAP
)
...
...
src/dot.h
View file @
9e1745a1
...
@@ -47,21 +47,9 @@ struct EdgeInfo
...
@@ -47,21 +47,9 @@ struct EdgeInfo
class
DotNode
class
DotNode
{
{
friend
class
DotGfxHierarchyTable
;
friend
class
DotClassGraph
;
friend
class
DotInclDepGraph
;
friend
class
DotNodeList
;
friend
void
writeDotGraph
(
DotNode
*
root
,
GraphOutputFormat
f
,
const
QCString
&
baseName
,
bool
lrRank
,
bool
renderParents
,
int
distance
,
bool
backArrow
);
public
:
public
:
DotNode
(
int
n
,
const
char
*
lab
,
const
char
*
url
,
int
distance
=
0
,
bool
rootNode
=
FALSE
);
enum
GraphType
{
Dependency
,
Inheritance
,
Collaboration
,
Hierarchy
};
DotNode
(
int
n
,
const
char
*
lab
,
const
char
*
url
,
int
distance
=
0
,
bool
rootNode
=
FALSE
,
ClassDef
*
cd
=
0
);
~
DotNode
();
~
DotNode
();
void
addChild
(
DotNode
*
n
,
void
addChild
(
DotNode
*
n
,
int
edgeColor
=
EdgeInfo
::
Purple
,
int
edgeColor
=
EdgeInfo
::
Purple
,
...
@@ -75,8 +63,8 @@ class DotNode
...
@@ -75,8 +63,8 @@ class DotNode
void
deleteNode
(
DotNodeList
&
deletedList
,
SDict
<
DotNode
>
*
skipNodes
=
0
);
void
deleteNode
(
DotNodeList
&
deletedList
,
SDict
<
DotNode
>
*
skipNodes
=
0
);
void
removeChild
(
DotNode
*
n
);
void
removeChild
(
DotNode
*
n
);
void
removeParent
(
DotNode
*
n
);
void
removeParent
(
DotNode
*
n
);
void
write
(
QTextStream
&
t
,
Graph
OutputFormat
f
,
bool
topDown
,
bool
toChildren
,
void
write
(
QTextStream
&
t
,
Graph
Type
gt
,
GraphOutputFormat
f
,
int
maxDistance
,
bool
backArrows
);
bool
topDown
,
bool
toChildren
,
int
maxDistance
,
bool
backArrows
);
int
m_subgraphId
;
int
m_subgraphId
;
void
clearWriteFlag
();
void
clearWriteFlag
();
void
writeXML
(
QTextStream
&
t
,
bool
isClassGraph
);
void
writeXML
(
QTextStream
&
t
,
bool
isClassGraph
);
...
@@ -86,9 +74,9 @@ class DotNode
...
@@ -86,9 +74,9 @@ class DotNode
private
:
private
:
void
colorConnectedNodes
(
int
curColor
);
void
colorConnectedNodes
(
int
curColor
);
void
writeBox
(
QTextStream
&
t
,
GraphOutputFormat
f
,
void
writeBox
(
QTextStream
&
t
,
Graph
Type
gt
,
Graph
OutputFormat
f
,
bool
hasNonReachableChildren
);
bool
hasNonReachableChildren
);
void
writeArrow
(
QTextStream
&
t
,
GraphOutputFormat
f
,
DotNode
*
cn
,
void
writeArrow
(
QTextStream
&
t
,
Graph
Type
gt
,
Graph
OutputFormat
f
,
DotNode
*
cn
,
EdgeInfo
*
ei
,
bool
topDown
,
bool
pointBack
=
TRUE
);
EdgeInfo
*
ei
,
bool
topDown
,
bool
pointBack
=
TRUE
);
const
DotNode
*
findDocNode
()
const
;
// only works for acyclic graphs!
const
DotNode
*
findDocNode
()
const
;
// only works for acyclic graphs!
int
m_number
;
int
m_number
;
...
@@ -102,6 +90,22 @@ class DotNode
...
@@ -102,6 +90,22 @@ class DotNode
bool
m_hasDoc
;
//!< used to mark a node as documented
bool
m_hasDoc
;
//!< used to mark a node as documented
int
m_distance
;
//!< distance to the root node
int
m_distance
;
//!< distance to the root node
bool
m_isRoot
;
//!< indicates if this is a root node
bool
m_isRoot
;
//!< indicates if this is a root node
ClassDef
*
m_classDef
;
//!< class representing this node (can be 0)
friend
class
DotGfxHierarchyTable
;
friend
class
DotClassGraph
;
friend
class
DotInclDepGraph
;
friend
class
DotNodeList
;
friend
void
writeDotGraph
(
DotNode
*
root
,
GraphType
gt
,
GraphOutputFormat
f
,
const
QCString
&
baseName
,
bool
lrRank
,
bool
renderParents
,
int
distance
,
bool
backArrow
);
};
};
class
DotGfxHierarchyTable
class
DotGfxHierarchyTable
...
@@ -124,8 +128,8 @@ class DotGfxHierarchyTable
...
@@ -124,8 +128,8 @@ class DotGfxHierarchyTable
class
DotClassGraph
class
DotClassGraph
{
{
public
:
public
:
enum
GraphType
{
Interface
,
Implementation
,
Inheritance
};
//
enum GraphType { Interface, Implementation, Inheritance };
DotClassGraph
(
ClassDef
*
cd
,
GraphType
t
,
int
maxRecusionDepth
);
DotClassGraph
(
ClassDef
*
cd
,
DotNode
::
GraphType
t
,
int
maxRecusionDepth
);
~
DotClassGraph
();
~
DotClassGraph
();
bool
isTrivial
()
const
;
bool
isTrivial
()
const
;
QCString
writeGraph
(
QTextStream
&
t
,
GraphOutputFormat
f
,
const
char
*
path
,
QCString
writeGraph
(
QTextStream
&
t
,
GraphOutputFormat
f
,
const
char
*
path
,
...
@@ -140,10 +144,10 @@ class DotClassGraph
...
@@ -140,10 +144,10 @@ class DotClassGraph
void
addClass
(
ClassDef
*
cd
,
DotNode
*
n
,
int
prot
,
const
char
*
label
,
void
addClass
(
ClassDef
*
cd
,
DotNode
*
n
,
int
prot
,
const
char
*
label
,
int
level
,
const
char
*
usedName
,
const
char
*
templSpec
,
int
level
,
const
char
*
usedName
,
const
char
*
templSpec
,
bool
base
);
bool
base
);
DotNode
*
m_startNode
;
DotNode
*
m_startNode
;
QDict
<
DotNode
>
*
m_usedNodes
;
QDict
<
DotNode
>
*
m_usedNodes
;
static
int
m_curNodeNumber
;
static
int
m_curNodeNumber
;
GraphType
m_graphType
;
DotNode
::
GraphType
m_graphType
;
int
m_recDepth
;
int
m_recDepth
;
QCString
m_diskName
;
QCString
m_diskName
;
int
m_maxDistance
;
int
m_maxDistance
;
...
...
src/doxygen.cpp
View file @
9e1745a1
...
@@ -2133,9 +2133,16 @@ static void buildFunctionList(Entry *root)
...
@@ -2133,9 +2133,16 @@ static void buildFunctionList(Entry *root)
//printf("root->parent=`%s' cd=%p root->type.find(re,0)=%d\n",
//printf("root->parent=`%s' cd=%p root->type.find(re,0)=%d\n",
// root->parent->name.data(),getClass(root->parent->name),
// root->parent->name.data(),getClass(root->parent->name),
// root->type.find(re,0));
// root->type.find(re,0));
QCString
scope
=
stripAnonymousNamespaceScope
(
root
->
parent
->
name
.
copy
()
);
QCString
scope
=
stripAnonymousNamespaceScope
(
root
->
parent
->
name
);
scope
=
stripTemplateSpecifiersFromScope
(
scope
,
FALSE
);
scope
=
stripTemplateSpecifiersFromScope
(
scope
,
FALSE
);
cd
=
getClass
(
scope
);
if
(
cd
&&
scope
+
"::"
==
rname
.
left
(
scope
.
length
()
+
2
))
// found A::f inside A
{
// strip scope from name
rname
=
rname
.
right
(
rname
.
length
()
-
root
->
parent
->
name
.
length
()
-
2
);
}
bool
isMember
=
FALSE
;
bool
isMember
=
FALSE
;
int
memIndex
=
rname
.
find
(
"::"
);
int
memIndex
=
rname
.
find
(
"::"
);
if
(
memIndex
!=-
1
)
if
(
memIndex
!=-
1
)
...
@@ -2154,7 +2161,7 @@ static void buildFunctionList(Entry *root)
...
@@ -2154,7 +2161,7 @@ static void buildFunctionList(Entry *root)
if
(
root
->
parent
&&
if
(
root
->
parent
&&
!
root
->
parent
->
name
.
isEmpty
()
&&
!
root
->
parent
->
name
.
isEmpty
()
&&
(
root
->
parent
->
section
&
Entry
::
COMPOUND_MASK
)
&&
(
root
->
parent
->
section
&
Entry
::
COMPOUND_MASK
)
&&
(
cd
=
getClass
(
scope
))
&&
cd
&&
// do some fuzzy things to exclude function pointers
// do some fuzzy things to exclude function pointers
(
root
->
type
.
isEmpty
()
||
root
->
type
.
find
(
re
,
0
)
==-
1
||
(
root
->
type
.
isEmpty
()
||
root
->
type
.
find
(
re
,
0
)
==-
1
||
root
->
type
.
find
(
")("
)
!=-
1
||
root
->
type
.
find
(
"operator"
)
!=-
1
root
->
type
.
find
(
")("
)
!=-
1
||
root
->
type
.
find
(
"operator"
)
!=-
1
...
@@ -4379,7 +4386,7 @@ static void findMember(Entry *root,
...
@@ -4379,7 +4386,7 @@ static void findMember(Entry *root,
{
{
Debug
::
print
(
Debug
::
FindMembers
,
0
,
Debug
::
print
(
Debug
::
FindMembers
,
0
,
"1. funcName=`%s'
\n
"
,
funcName
.
data
());
"1. funcName=`%s'
\n
"
,
funcName
.
data
());
if
(
funcName
.
left
(
9
)
==
"operator "
)
if
(
funcName
.
left
(
9
)
==
"operator "
)
// strip class scope from cast operator
{
{
funcName
=
substitute
(
funcName
,
className
+
"::"
,
""
);
funcName
=
substitute
(
funcName
,
className
+
"::"
,
""
);
}
}
...
...
src/htmlgen.cpp
View file @
9e1745a1
...
@@ -38,14 +38,14 @@
...
@@ -38,14 +38,14 @@
//#define DBG_HTML(x) x;
//#define DBG_HTML(x) x;
#define DBG_HTML(x)
#define DBG_HTML(x)
/*
changed default stylesheet, startIndexKey(), startIndexValue()
02 jan 2002, jh
*/
static
const
char
*
defaultStyleSheet
=
static
const
char
*
defaultStyleSheet
=
"H1 { text-align: center; }
\n
"
"H1 {
\n
"
" text-align: center;
\n
"
" font-family: Arial, Helvetica, sans-serif;
\n
"
"}
\n
"
"H2 {
\n
"
" font-family: Geneva, Arial, Helvetica, sans-serif;
\n
"
"}
\n
"
"CAPTION { font-weight: bold }
\n
"
"CAPTION { font-weight: bold }
\n
"
"A.qindex {}
\n
"
"A.qindex {}
\n
"
"A.qindexRef {}
\n
"
"A.qindexRef {}
\n
"
...
@@ -55,15 +55,25 @@ static const char *defaultStyleSheet =
...
@@ -55,15 +55,25 @@ static const char *defaultStyleSheet =
"A.codeRef { font-weight: normal; color: #4444ee }
\n
"
"A.codeRef { font-weight: normal; color: #4444ee }
\n
"
"A:hover { text-decoration: none; background-color: #f2f2ff }
\n
"
"A:hover { text-decoration: none; background-color: #f2f2ff }
\n
"
"DL.el { margin-left: -1cm }
\n
"
"DL.el { margin-left: -1cm }
\n
"
"DIV.fragment { width: 100%; border: none; background-color: #eeeeee }
\n
"
"DIV.fragment {
\n
"
" width: 98%;
\n
"
" border: 1px solid #CCCCCC;
\n
"
" background-color: #f5f5f5;
\n
"
" padding: 0px;
\n
"
" margin: 4px;
\n
"
"}
\n
"
"DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }
\n
"
"DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }
\n
"
"TD.md { background-color: #f2f2ff; font-weight: bold; }
\n
"
"TD.md { background-color: #f2f2ff; font-weight: bold; }
\n
"
"TD.mdname1 { background-color: #f2f2ff; font-weight: bold; color: #602020; }
\n
"
"TD.mdname1 { background-color: #f2f2ff; font-weight: bold; color: #602020; }
\n
"
"TD.mdname { background-color: #f2f2ff; font-weight: bold; color: #602020; width: 600px; }
\n
"
"TD.mdname { background-color: #f2f2ff; font-weight: bold; color: #602020; width: 600px; }
\n
"
"DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold }
\n
"
"DIV.groupHeader { margin-left: 16px; margin-top: 12px; margin-bottom: 6px; font-weight: bold }
\n
"
"DIV.groupText { margin-left: 16px; font-style: italic; font-size: smaller }
\n
"
"DIV.groupText { margin-left: 16px; font-style: italic; font-size: smaller }
\n
"
"BODY { background: white; color: black }
\n
"
"BODY {
\n
"
"EM.mdesc { font-size: smaller }
\n
"
" background: white;
\n
"
" color: black;
\n
"
" margin-right: 20px;
\n
"
" margin-left: 20px;
\n
"
"}
\n
"
"TD.indexkey {
\n
"
"TD.indexkey {
\n
"
" background-color: #eeeeff;
\n
"
" background-color: #eeeeff;
\n
"
" font-weight: bold;
\n
"
" font-weight: bold;
\n
"
...
@@ -91,17 +101,86 @@ static const char *defaultStyleSheet =
...
@@ -91,17 +101,86 @@ static const char *defaultStyleSheet =
"TR.memlist {
\n
"
"TR.memlist {
\n
"
" background-color: #f0f0f0;
\n
"
" background-color: #f0f0f0;
\n
"
"}
\n
"
"}
\n
"
"p.formulaDsp { text-align: center; }
\n
"
"P.formulaDsp { text-align: center; }
\n
"
"img.formulaDsp { }
\n
"
"IMG.formulaDsp { }
\n
"
"img.formulaInl { vertical-align: middle; }
\n
"
"IMG.formulaInl { vertical-align: middle; }
\n
"
"span.keyword { color: #008000 }
\n
"
"SPAN.keyword { color: #008000 }
\n
"
"span.keywordtype { color: #604020 }
\n
"
"SPAN.keywordtype { color: #604020 }
\n
"
"span.keywordflow { color: #e08000 }
\n
"
"SPAN.keywordflow { color: #e08000 }
\n
"
"span.comment { color: #800000 }
\n
"
"SPAN.comment { color: #800000 }
\n
"
"span.preprocessor { color: #806020 }
\n
"
"SPAN.preprocessor { color: #806020 }
\n
"
"span.stringliteral { color: #002080 }
\n
"
"SPAN.stringliteral { color: #002080 }
\n
"
"span.charliteral { color: #008080 }
\n
"
;
"SPAN.charliteral { color: #008080 }
\n
"
".mdTable {
\n
"
" border: 1px solid #868686;
\n
"
" background-color: #f2f2ff;
\n
"
"}
\n
"
".mdRow {
\n
"
" padding: 8px 20px;
\n
"
"}
\n
"
".mdescLeft {
\n
"
" font-size: smaller;
\n
"
" font-family: Arial, Helvetica, sans-serif;
\n
"
" background-color: #FAFAFA;
\n
"
" padding-left: 8px;
\n
"
" border-top: 1px none #E0E0E0;
\n
"
" border-right: 1px none #E0E0E0;
\n
"
" border-bottom: 1px none #E0E0E0;
\n
"
" border-left: 1px none #E0E0E0;
\n
"
" margin: 0px;
\n
"
"}
\n
"
".mdescRight {
\n
"
" font-size: smaller;
\n
"
" font-family: Arial, Helvetica, sans-serif;
\n
"
" font-style: italic;
\n
"
" background-color: #FAFAFA;
\n
"
" padding-left: 4px;
\n
"
" border-top: 1px none #E0E0E0;
\n
"
" border-right: 1px none #E0E0E0;
\n
"
" border-bottom: 1px none #E0E0E0;
\n
"
" border-left: 1px none #E0E0E0;
\n
"
" margin: 0px;
\n
"
" padding-bottom: 0px;
\n
"
" padding-right: 8px;
\n
"
"}
\n
"
".memItemLeft {
\n
"
" padding: 1px 0px 0px 8px;
\n
"
" margin: 4px;
\n
"
" border-top-width: 1px;
\n
"
" border-right-width: 1px;
\n
"
" border-bottom-width: 1px;
\n
"
" border-left-width: 1px;
\n
"
" border-top-style: solid;
\n
"
" border-top-color: #E0E0E0;
\n
"
" border-right-color: #E0E0E0;
\n
"
" border-bottom-color: #E0E0E0;
\n
"
" border-left-color: #E0E0E0;
\n
"
" border-right-style: none;
\n
"
" border-bottom-style: none;
\n
"
" border-left-style: none;
\n
"
" background-color: #FAFAFA;
\n
"
" font-family: Geneva, Arial, Helvetica, sans-serif;
\n
"
" font-size: 12px;
\n
"
"}
\n
"
".memItemRight {
\n
"
" padding: 1px 0px 0px 8px;
\n
"
" margin: 4px;
\n
"
" border-top-width: 1px;
\n
"
" border-right-width: 1px;
\n
"
" border-bottom-width: 1px;
\n
"
" border-left-width: 1px;
\n
"
" border-top-style: solid;
\n
"
" border-top-color: #E0E0E0;
\n
"
" border-right-color: #E0E0E0;
\n
"
" border-bottom-color: #E0E0E0;
\n
"
" border-left-color: #E0E0E0;
\n
"
" border-right-style: none;
\n
"
" border-bottom-style: none;
\n
"
" border-left-style: none;
\n
"
" background-color: #FAFAFA;
\n
"
" font-family: Geneva, Arial, Helvetica, sans-serif;
\n
"
" font-size: 13px;
\n
"
"}
\n
"
;
static
QCString
g_header
;
static
QCString
g_header
;
static
QCString
g_footer
;
static
QCString
g_footer
;
...
@@ -117,12 +196,6 @@ HtmlGenerator::~HtmlGenerator()
...
@@ -117,12 +196,6 @@ HtmlGenerator::~HtmlGenerator()
//printf("HtmlGenerator::~HtmlGenerator()\n");
//printf("HtmlGenerator::~HtmlGenerator()\n");
}
}
//void HtmlGenerator::append(const OutputGenerator *g)
//{
// t << g->getContents();
// col+=((HtmlGenerator *)g)->col;
//}
void
HtmlGenerator
::
init
()
void
HtmlGenerator
::
init
()
{
{
QCString
dname
=
Config_getString
(
"HTML_OUTPUT"
);
QCString
dname
=
Config_getString
(
"HTML_OUTPUT"
);
...
@@ -190,15 +263,12 @@ void HtmlGenerator::writeHeaderFile(QFile &file)
...
@@ -190,15 +263,12 @@ void HtmlGenerator::writeHeaderFile(QFile &file)
void
HtmlGenerator
::
writeFooterFile
(
QFile
&
file
)
void
HtmlGenerator
::
writeFooterFile
(
QFile
&
file
)
{
{
QTextStream
t
(
&
file
);
QTextStream
t
(
&
file
);
t
<<
"<hr><address style=
\"
align: right;
\"
><small>
\n
"
;
t
<<
"<hr
size=
\"
1
\"
><address style=
\"
align: right;
\"
><small>
\n
"
;
t
<<
theTranslator
->
trGeneratedAt
(
"$datetime"
,
"$projectname"
);
t
<<
theTranslator
->
trGeneratedAt
(
"$datetime"
,
"$projectname"
);
t
<<
" <a href=
\"
http://www.doxygen.org/index.html
\"
>
\n
"
t
<<
" <a href=
\"
http://www.doxygen.org/index.html
\"
>
\n
"
<<
"<img src=
\"
doxygen.png
\"
alt=
\"
doxygen
\"
"
<<
"<img src=
\"
doxygen.png
\"
alt=
\"
doxygen
\"
"
<<
"align=
\"
middle
\"
border=0
width=110 height=53
>
\n
"
<<
"align=
\"
middle
\"
border=0>
\n
"
<<
"</a> $doxygenversion"
;
<<
"</a> $doxygenversion"
;
// << " " << theTranslator->trWrittenBy()
// << " <a href=\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>,\n"
// << " © 1997-2003"
t
<<
"</small></address>
\n
"
t
<<
"</small></address>
\n
"
<<
"</body>
\n
"
<<
"</body>
\n
"
<<
"</html>
\n
"
;
<<
"</html>
\n
"
;
...
@@ -220,6 +290,7 @@ void HtmlGenerator::startFile(const char *name,const char *,
...
@@ -220,6 +290,7 @@ void HtmlGenerator::startFile(const char *name,const char *,
{
{
HtmlHelp
::
getInstance
()
->
addIndexFile
(
fileName
);
HtmlHelp
::
getInstance
()
->
addIndexFile
(
fileName
);
}
}
QCString
dispTitle
=
title
;
QCString
dispTitle
=
title
;
QCString
projName
=
Config_getString
(
"PROJECT_NAME"
);
QCString
projName
=
Config_getString
(
"PROJECT_NAME"
);
if
(
!
projName
.
isEmpty
())
if
(
!
projName
.
isEmpty
())
...
@@ -275,7 +346,7 @@ void HtmlGenerator::writeFooter(int part,bool external)
...
@@ -275,7 +346,7 @@ void HtmlGenerator::writeFooter(int part,bool external)
{
{
case
0
:
case
0
:
if
(
g_footer
.
isEmpty
())
if
(
g_footer
.
isEmpty
())
t
<<
"<hr><address style=
\"
align: right;
\"
><small>"
;
t
<<
"<hr
size=
\"
1
\"
><address style=
\"
align: right;
\"
><small>"
;
else
else
t
<<
substituteKeywords
(
g_footer
,
convertToHtml
(
lastTitle
));
t
<<
substituteKeywords
(
g_footer
,
convertToHtml
(
lastTitle
));
break
;
break
;
...
@@ -294,8 +365,8 @@ void HtmlGenerator::writeFooter(int part,bool external)
...
@@ -294,8 +365,8 @@ void HtmlGenerator::writeFooter(int part,bool external)
t
<<
"src=
\"
"
;
t
<<
"src=
\"
"
;
}
}
t
<<
"doxygen.png
\"
alt=
\"
doxygen
\"
"
t
<<
"doxygen.png
\"
alt=
\"
doxygen
\"
"
<<
"align=
\"
middle
\"
border=0 "
<<
endl
<<
<<
"align=
\"
middle
\"
border=0
>
"
<<
endl
<<
"
width=110 height=53>
</a>"
<<
versionString
<<
" "
;
"</a>"
<<
versionString
<<
" "
;
}
}
break
;
break
;
default
:
default
:
...
@@ -523,13 +594,6 @@ void HtmlGenerator::endHtmlLink()
...
@@ -523,13 +594,6 @@ void HtmlGenerator::endHtmlLink()
t
<<
"</a>"
;
t
<<
"</a>"
;
}
}
//void HtmlGenerator::writeMailLink(const char *url)
//{
// t << "<a href=\"mailto:" << url << "\">";
// docify(url);
// t << "</a>";
//}
void
HtmlGenerator
::
startGroupHeader
()
void
HtmlGenerator
::
startGroupHeader
()
{
{
t
<<
"<h2>"
;
t
<<
"<h2>"
;
...
@@ -568,46 +632,6 @@ void HtmlGenerator::endSection(const char *,SectionInfo::SectionType type)
...
@@ -568,46 +632,6 @@ void HtmlGenerator::endSection(const char *,SectionInfo::SectionType type)
}
}
}
}
//void HtmlGenerator::writeSectionRef(const char *ref,const char *name,
// const char *anchor,const char *title)
//{
// QCString *dest;
// //printf("writeSectionRef(%s,%s,%s,%s)\n",ref,name,anchor,title);
// QCString refName=name;
// if (refName.right(Doxygen::htmlFileExtension.length())!=Doxygen::htmlFileExtension)
// {
// refName+=Doxygen::htmlFileExtension;
// }
// t << "<a ";
// if (ref)
// {
// t << "doxygen=\"" << ref << ":";
// if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
// t << "\" ";
// }
// t << "href=\"";
// if (ref)
// {
// if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
// }
// t << refName << "#" << anchor << "\">";
// docify(title);
// t << "</a>";
//}
//
//void HtmlGenerator::writeSectionRefItem(const char *name,const char *lab,
// const char *title)
//{
// QCString refName=name;
// if (refName.right(Doxygen::htmlFileExtension.length())!=Doxygen::htmlFileExtension)
// {
// refName+=Doxygen::htmlFileExtension;
// }
// t << "<li><a href=\"" << refName << "#" << lab << "\">";
// docify(title);
// t << "</a>";
//}
//
void
HtmlGenerator
::
docify
(
const
char
*
str
)
void
HtmlGenerator
::
docify
(
const
char
*
str
)
{
{
if
(
str
)
if
(
str
)
...
@@ -705,32 +729,6 @@ void HtmlGenerator::endClassDiagram(ClassDiagram &d,
...
@@ -705,32 +729,6 @@ void HtmlGenerator::endClassDiagram(ClassDiagram &d,
d
.
writeImage
(
t
,
dir
,
fileName
);
d
.
writeImage
(
t
,
dir
,
fileName
);
}
}
//void HtmlGenerator::startColorFont(uchar red,uchar green,uchar blue)
//{
// QCString colorString;
// colorString.sprintf("%02x%02x%02x",red,green,blue);
// t << "<font color=\"#" << colorString << "\">";
//}
//
//void HtmlGenerator::endColorFont()
//{
// t << "</font>";
//}
//void HtmlGenerator::writeFormula(const char *n,const char *text)
//{
// if (text && text[0]=='\\') t << "<p><center>" << endl;
// t << "<img align=";
//#if !defined(_WIN32)
// t << "\"top\""; // assume Unix users use Netscape 4.x which does
// // not seem to support align == "middle" :-((
//#else
// t << "\"middle\""; // assume Windows users use IE or HtmlHelp which only
// // displays formulas nicely with align == "middle"
//#endif
// t << " src=\"" << n << ".png\">" << endl;
// if (text && text[0]=='\\') t << "</center><p>" << endl;
//}
void
HtmlGenerator
::
startMemberList
()
void
HtmlGenerator
::
startMemberList
()
{
{
...
@@ -768,9 +766,9 @@ void HtmlGenerator::startMemberItem(int annoType)
...
@@ -768,9 +766,9 @@ void HtmlGenerator::startMemberItem(int annoType)
t
<<
"<tr>"
;
t
<<
"<tr>"
;
switch
(
annoType
)
switch
(
annoType
)
{
{
case
0
:
t
<<
"<td nowrap align=right valign=top>"
;
break
;
case
0
:
t
<<
"<td
class=
\"
memItemLeft
\"
nowrap align=right valign=top>"
;
break
;
case
1
:
t
<<
"<td nowrap>"
;
break
;
case
1
:
t
<<
"<td
class=
\"
memItemLeft
\"
nowrap>"
;
break
;
default
:
t
<<
"<td nowrap valign=top>"
;
break
;
default
:
t
<<
"<td
class=
\"
memItemLeft
\"
nowrap valign=top>"
;
break
;
}
}
}
}
else
else
...
@@ -784,7 +782,7 @@ void HtmlGenerator::endMemberItem()
...
@@ -784,7 +782,7 @@ void HtmlGenerator::endMemberItem()
//DBG_HTML(t << "<!-- endMemberItem(" << (int)inGroup << "," << fileName << "," << headerName << " -->" << endl)
//DBG_HTML(t << "<!-- endMemberItem(" << (int)inGroup << "," << fileName << "," << headerName << " -->" << endl)
if
(
Config_getBool
(
"HTML_ALIGN_MEMBERS"
))
if
(
Config_getBool
(
"HTML_ALIGN_MEMBERS"
))
{
{
t
<<
"</td></tr>"
;
t
<<
"</td></tr>
\n
"
;
}
}
t
<<
endl
;
t
<<
endl
;
}
}
...
@@ -795,7 +793,7 @@ void HtmlGenerator::insertMemberAlign()
...
@@ -795,7 +793,7 @@ void HtmlGenerator::insertMemberAlign()
DBG_HTML
(
t
<<
"<!-- insertMemberAlign -->"
<<
endl
)
DBG_HTML
(
t
<<
"<!-- insertMemberAlign -->"
<<
endl
)
if
(
Config_getBool
(
"HTML_ALIGN_MEMBERS"
))
if
(
Config_getBool
(
"HTML_ALIGN_MEMBERS"
))
{
{
t
<<
" </td><td valign=bottom>"
;
t
<<
" </td><td
class=
\"
memItemRight
\"
valign=bottom>"
;
}
}
}
}
...
@@ -804,11 +802,11 @@ void HtmlGenerator::startMemberDescription()
...
@@ -804,11 +802,11 @@ void HtmlGenerator::startMemberDescription()
DBG_HTML
(
t
<<
"<!-- startMemberDescription -->"
<<
endl
)
DBG_HTML
(
t
<<
"<!-- startMemberDescription -->"
<<
endl
)
if
(
Config_getBool
(
"HTML_ALIGN_MEMBERS"
))
if
(
Config_getBool
(
"HTML_ALIGN_MEMBERS"
))
{
{
t
<<
"<tr><td
> </td><td><em class=
\"
mdesc
\"
>"
;
t
<<
"<tr><td
class=
\"
mdescLeft
\"
> </td><td class=
\"
mdescRight
\"
>"
;
}
}
else
else
{
{
t
<<
"<dl class=
\"
el
\"
><dd
><em class=
\"
mdesc
\"
>"
;
t
<<
"<dl class=
\"
el
\"
><dd
class=
\"
mdescRight
\"
>"
;
}
}
}
}
...
@@ -817,11 +815,11 @@ void HtmlGenerator::endMemberDescription()
...
@@ -817,11 +815,11 @@ void HtmlGenerator::endMemberDescription()
DBG_HTML
(
t
<<
"<!-- endMemberDescription -->"
<<
endl
)
DBG_HTML
(
t
<<
"<!-- endMemberDescription -->"
<<
endl
)
if
(
Config_getBool
(
"HTML_ALIGN_MEMBERS"
))
if
(
Config_getBool
(
"HTML_ALIGN_MEMBERS"
))
{
{
t
<<
"<
/em><
br><br></td></tr>"
<<
endl
;
t
<<
"<br><br></td></tr>"
<<
endl
;
}
}
else
else
{
{
t
<<
"<br><br></
em></
dl>"
;
t
<<
"<br><br></dl>"
;
}
}
}
}
...
@@ -915,83 +913,13 @@ void HtmlGenerator::endIndexValue(const char *,bool)
...
@@ -915,83 +913,13 @@ void HtmlGenerator::endIndexValue(const char *,bool)
t
<<
"</td></tr>"
<<
endl
;
t
<<
"</td></tr>"
<<
endl
;
}
}
//void HtmlGenerator::startAlphabeticalIndexList()
//{
// t << "<table align=center width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">" << endl;
//}
//void HtmlGenerator::endAlphabeticalIndexList()
//{
// t << "</table>" << endl;
//}
//void HtmlGenerator::writeIndexHeading(const char *s)
//{
// t << "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr><td><div class=\"ah\"> " << s
// << " </td></tr></table>";
//}
//void HtmlGenerator::startImage(const char *name,const char *,bool hasCaption)
//{
// QCString baseName=name;
// int i;
// if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
// {
// baseName=baseName.right(baseName.length()-i-1);
// }
// t << "<div align=\"center\">" << endl;
// t << "<img src=\"" << name << "\" alt=\"" << baseName << "\">" << endl;
// if (hasCaption)
// {
// t << "<p><strong>";
// }
//}
//void HtmlGenerator::endImage(bool hasCaption)
//{
// if (hasCaption)
// {
// t << "</strong></p>" << endl;
// }
// t << "</div>" << endl;
//}
//void HtmlGenerator::startDotFile(const char *name,bool hasCaption)
//{
// QCString baseName=name;
// int i;
// if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
// {
// baseName=baseName.right(baseName.length()-i-1);
// }
// QCString outDir = Config_getString("HTML_OUTPUT");
// writeDotGraphFromFile(name,outDir,baseName,BITMAP);
// t << "<div align=\"center\">" << endl;
// t << "<img src=\"" << baseName << "."
// << Config_getEnum("DOT_IMAGE_FORMAT") << "\" alt=\""
// << baseName << "\">" << endl;
// if (hasCaption)
// {
// t << "<p><strong>";
// }
//}
//
//void HtmlGenerator::endDotFile(bool hasCaption)
//{
// if (hasCaption)
// {
// t << "</strong></p>" << endl;
// }
// t << "</div>" << endl;
//}
//
void
HtmlGenerator
::
startMemberDoc
(
const
char
*
,
const
char
*
,
const
char
*
,
const
char
*
)
void
HtmlGenerator
::
startMemberDoc
(
const
char
*
,
const
char
*
,
const
char
*
,
const
char
*
)
{
{
DBG_HTML
(
t
<<
"<!-- startMemberDoc -->"
<<
endl
;)
DBG_HTML
(
t
<<
"<!-- startMemberDoc -->"
<<
endl
;)
t
<<
"<p>"
<<
endl
;
t
<<
"<p>"
<<
endl
;
t
<<
"<table
width=
\"
100%
\"
cellpadding=
\"
2
\"
cellspacing=
\"
0
\"
border
=
\"
0
\"
>"
<<
endl
;
t
<<
"<table
class=
\"
mdTable
\"
width=
\"
100%
\"
cellpadding=
\"
2
\"
cellspacing
=
\"
0
\"
>"
<<
endl
;
t
<<
" <tr>"
<<
endl
;
t
<<
" <tr>"
<<
endl
;
t
<<
" <td class=
\"
md
\"
>"
<<
endl
;
t
<<
" <td class=
\"
md
Row
\"
>"
<<
endl
;
t
<<
" <table cellpadding=
\"
0
\"
cellspacing=
\"
0
\"
border=
\"
0
\"
>"
<<
endl
;
t
<<
" <table cellpadding=
\"
0
\"
cellspacing=
\"
0
\"
border=
\"
0
\"
>"
<<
endl
;
}
}
...
@@ -1250,19 +1178,6 @@ void HtmlGenerator::endParamList()
...
@@ -1250,19 +1178,6 @@ void HtmlGenerator::endParamList()
t
<<
"</dl>"
;
t
<<
"</dl>"
;
}
}
//void HtmlGenerator::startSectionRefList()
//{
// t << "<multicol cols=3>" << endl;
// t << "<ul>" << endl;
//}
//void HtmlGenerator::endSectionRefList()
//{
// t << "</ul>" << endl;
// t << "</multicol>" << endl;
//}
void
HtmlGenerator
::
printDoc
(
DocNode
*
n
)
void
HtmlGenerator
::
printDoc
(
DocNode
*
n
)
{
{
HtmlDocVisitor
*
visitor
=
new
HtmlDocVisitor
(
t
,
*
this
);
HtmlDocVisitor
*
visitor
=
new
HtmlDocVisitor
(
t
,
*
this
);
...
...
src/memberdef.cpp
View file @
9e1745a1
...
@@ -75,7 +75,7 @@ static QCString addTemplateNames(const QCString &s,const QCString &n,const QCStr
...
@@ -75,7 +75,7 @@ static QCString addTemplateNames(const QCString &s,const QCString &n,const QCStr
}
}
static
void
writeDefArgumentList
(
OutputList
&
ol
,
ClassDef
*
cd
,
static
void
writeDefArgumentList
(
OutputList
&
ol
,
ClassDef
*
cd
,
const
QCString
&
scopeName
,
MemberDef
*
md
)
const
QCString
&
/*scopeName*/
,
MemberDef
*
md
)
{
{
ArgumentList
*
defArgList
=
md
->
isDocsForDefinition
()
?
ArgumentList
*
defArgList
=
md
->
isDocsForDefinition
()
?
md
->
argumentList
()
:
md
->
declArgumentList
();
md
->
argumentList
()
:
md
->
declArgumentList
();
...
@@ -96,10 +96,6 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
...
@@ -96,10 +96,6 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
Argument
*
a
=
defArgList
->
first
();
Argument
*
a
=
defArgList
->
first
();
QCString
cName
;
QCString
cName
;
//if (md->scopeDefTemplateArguments())
//{
// cName=tempArgListToString(md->scopeDefTemplateArguments());
//}
if
(
cd
)
if
(
cd
)
{
{
cName
=
cd
->
name
();
cName
=
cd
->
name
();
...
@@ -138,13 +134,13 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
...
@@ -138,13 +134,13 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
//printf("a->type=`%s' a->name=`%s'\n",a->type.data(),a->name.data());
//printf("a->type=`%s' a->name=`%s'\n",a->type.data(),a->name.data());
QCString
n
=
a
->
type
.
left
(
vp
);
QCString
n
=
a
->
type
.
left
(
vp
);
if
(
!
cName
.
isEmpty
())
n
=
addTemplateNames
(
n
,
cd
->
name
(),
cName
);
if
(
!
cName
.
isEmpty
())
n
=
addTemplateNames
(
n
,
cd
->
name
(),
cName
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
scopeName
,
md
->
name
(),
n
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
cd
,
md
->
name
(),
n
);
}
}
else
// non-function pointer type
else
// non-function pointer type
{
{
QCString
n
=
a
->
type
;
QCString
n
=
a
->
type
;
if
(
!
cName
.
isEmpty
())
n
=
addTemplateNames
(
n
,
cd
->
name
(),
cName
);
if
(
!
cName
.
isEmpty
())
n
=
addTemplateNames
(
n
,
cd
->
name
(),
cName
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
scopeName
,
md
->
name
(),
n
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
cd
,
md
->
name
(),
n
);
}
}
if
(
!
md
->
isDefine
())
if
(
!
md
->
isDefine
())
{
{
...
@@ -169,7 +165,7 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
...
@@ -169,7 +165,7 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
if
(
vp
!=-
1
)
// write the part of the argument type
if
(
vp
!=-
1
)
// write the part of the argument type
// that comes after the name
// that comes after the name
{
{
linkifyText
(
TextGeneratorOLImpl
(
ol
),
scopeName
,
linkifyText
(
TextGeneratorOLImpl
(
ol
),
cd
,
md
->
name
(),
a
->
type
.
right
(
a
->
type
.
length
()
-
vp
));
md
->
name
(),
a
->
type
.
right
(
a
->
type
.
length
()
-
vp
));
}
}
if
(
!
a
->
defval
.
isEmpty
())
// write the default value
if
(
!
a
->
defval
.
isEmpty
())
// write the default value
...
@@ -177,7 +173,7 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
...
@@ -177,7 +173,7 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd,
QCString
n
=
a
->
defval
;
QCString
n
=
a
->
defval
;
if
(
!
cName
.
isEmpty
())
n
=
addTemplateNames
(
n
,
cd
->
name
(),
cName
);
if
(
!
cName
.
isEmpty
())
n
=
addTemplateNames
(
n
,
cd
->
name
(),
cName
);
ol
.
docify
(
" = "
);
ol
.
docify
(
" = "
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
scopeName
,
md
->
name
(),
n
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
cd
,
md
->
name
(),
n
);
}
}
a
=
defArgList
->
next
();
a
=
defArgList
->
next
();
if
(
a
)
if
(
a
)
...
@@ -799,21 +795,21 @@ void MemberDef::writeDeclaration(OutputList &ol,
...
@@ -799,21 +795,21 @@ void MemberDef::writeDeclaration(OutputList &ol,
{
{
if
(
getAnonymousEnumType
())
// type is an anonymous enum
if
(
getAnonymousEnumType
())
// type is an anonymous enum
{
{
linkifyText
(
TextGeneratorOLImpl
(
ol
),
cname
,
name
(),
ltype
.
left
(
i
),
TRUE
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
d
,
name
(),
ltype
.
left
(
i
),
TRUE
);
getAnonymousEnumType
()
->
writeEnumDeclaration
(
ol
,
cd
,
nd
,
fd
,
gd
);
getAnonymousEnumType
()
->
writeEnumDeclaration
(
ol
,
cd
,
nd
,
fd
,
gd
);
//ol+=*getAnonymousEnumType()->enumDecl();
//ol+=*getAnonymousEnumType()->enumDecl();
linkifyText
(
TextGeneratorOLImpl
(
ol
),
cname
,
name
(),
ltype
.
right
(
ltype
.
length
()
-
i
-
l
),
TRUE
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
d
,
name
(),
ltype
.
right
(
ltype
.
length
()
-
i
-
l
),
TRUE
);
}
}
else
else
{
{
ltype
=
ltype
.
left
(
i
)
+
" { ... } "
+
ltype
.
right
(
ltype
.
length
()
-
i
-
l
);
ltype
=
ltype
.
left
(
i
)
+
" { ... } "
+
ltype
.
right
(
ltype
.
length
()
-
i
-
l
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
cname
,
name
(),
ltype
,
TRUE
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
d
,
name
(),
ltype
,
TRUE
);
}
}
}
}
}
}
else
else
{
{
linkifyText
(
TextGeneratorOLImpl
(
ol
),
cname
,
name
(),
ltype
,
TRUE
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
d
,
name
(),
ltype
,
TRUE
);
}
}
bool
htmlOn
=
ol
.
isEnabled
(
OutputGenerator
::
Html
);
bool
htmlOn
=
ol
.
isEnabled
(
OutputGenerator
::
Html
);
if
(
htmlOn
&&
Config_getBool
(
"HTML_ALIGN_MEMBERS"
)
&&
!
ltype
.
isEmpty
())
if
(
htmlOn
&&
Config_getBool
(
"HTML_ALIGN_MEMBERS"
)
&&
!
ltype
.
isEmpty
())
...
@@ -884,7 +880,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
...
@@ -884,7 +880,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
{
{
if
(
!
isDefine
())
ol
.
writeString
(
" "
);
if
(
!
isDefine
())
ol
.
writeString
(
" "
);
//ol.docify(argsString());
//ol.docify(argsString());
linkifyText
(
TextGeneratorOLImpl
(
ol
),
cname
,
name
(),
argsString
());
linkifyText
(
TextGeneratorOLImpl
(
ol
),
d
,
name
(),
argsString
());
}
}
if
(
excpString
())
if
(
excpString
())
...
@@ -895,7 +891,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
...
@@ -895,7 +891,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
if
(
!
bitfields
.
isEmpty
())
// add bitfields
if
(
!
bitfields
.
isEmpty
())
// add bitfields
{
{
linkifyText
(
TextGeneratorOLImpl
(
ol
),
cname
,
name
(),
bitfields
.
simplifyWhiteSpace
());
linkifyText
(
TextGeneratorOLImpl
(
ol
),
d
,
name
(),
bitfields
.
simplifyWhiteSpace
());
}
}
else
if
(
hasOneLineInitializer
()
else
if
(
hasOneLineInitializer
()
//!init.isEmpty() && initLines==0 && // one line initializer
//!init.isEmpty() && initLines==0 && // one line initializer
...
@@ -905,12 +901,12 @@ void MemberDef::writeDeclaration(OutputList &ol,
...
@@ -905,12 +901,12 @@ void MemberDef::writeDeclaration(OutputList &ol,
if
(
!
isDefine
())
if
(
!
isDefine
())
{
{
ol
.
writeString
(
" = "
);
ol
.
writeString
(
" = "
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
cname
,
name
(),
init
.
simplifyWhiteSpace
());
linkifyText
(
TextGeneratorOLImpl
(
ol
),
d
,
name
(),
init
.
simplifyWhiteSpace
());
}
}
else
else
{
{
ol
.
writeNonBreakableSpace
(
3
);
ol
.
writeNonBreakableSpace
(
3
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
cname
,
name
(),
init
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
d
,
name
(),
init
);
}
}
}
}
...
@@ -1087,10 +1083,10 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
...
@@ -1087,10 +1083,10 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
{
{
htmlHelp
->
addIndexItem
(
cname
,
name
(),
cfname
,
anchor
());
htmlHelp
->
addIndexItem
(
cname
,
name
(),
cfname
,
anchor
());
}
}
linkifyText
(
TextGeneratorOLImpl
(
ol
),
scopeName
,
name
(),
ldef
.
left
(
i
));
linkifyText
(
TextGeneratorOLImpl
(
ol
),
container
,
name
(),
ldef
.
left
(
i
));
//ol+=*vmd->enumDecl();
//ol+=*vmd->enumDecl();
vmd
->
writeEnumDeclaration
(
ol
,
getClassDef
(),
getNamespaceDef
(),
getFileDef
(),
getGroupDef
());
vmd
->
writeEnumDeclaration
(
ol
,
getClassDef
(),
getNamespaceDef
(),
getFileDef
(),
getGroupDef
());
linkifyText
(
TextGeneratorOLImpl
(
ol
),
scopeName
,
name
(),
ldef
.
right
(
ldef
.
length
()
-
i
-
l
));
linkifyText
(
TextGeneratorOLImpl
(
ol
),
container
,
name
(),
ldef
.
right
(
ldef
.
length
()
-
i
-
l
));
found
=
TRUE
;
found
=
TRUE
;
}
}
...
@@ -1115,7 +1111,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
...
@@ -1115,7 +1111,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
// last ei characters of ldef contain pointer/reference specifiers
// last ei characters of ldef contain pointer/reference specifiers
int
ni
=
ldef
.
find
(
"::"
,
si
);
int
ni
=
ldef
.
find
(
"::"
,
si
);
if
(
ni
>=
ei
)
ei
=
ni
+
2
;
if
(
ni
>=
ei
)
ei
=
ni
+
2
;
linkifyText
(
TextGeneratorOLImpl
(
ol
),
scopeName
,
name
(),
ldef
.
right
(
ldef
.
length
()
-
ei
));
linkifyText
(
TextGeneratorOLImpl
(
ol
),
container
,
name
(),
ldef
.
right
(
ldef
.
length
()
-
ei
));
}
}
}
}
else
// not an enum value
else
// not an enum value
...
@@ -1177,25 +1173,25 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
...
@@ -1177,25 +1173,25 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
}
}
}
}
ol
.
startMemberDocName
();
ol
.
startMemberDocName
();
linkifyText
(
TextGeneratorOLImpl
(
ol
),
scopeName
,
name
(),
ldef
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
container
,
name
(),
ldef
);
writeDefArgumentList
(
ol
,
cd
,
scopeName
,
this
);
writeDefArgumentList
(
ol
,
cd
,
scopeName
,
this
);
if
(
hasOneLineInitializer
())
// add initializer
if
(
hasOneLineInitializer
())
// add initializer
{
{
if
(
!
isDefine
())
if
(
!
isDefine
())
{
{
ol
.
docify
(
" = "
);
ol
.
docify
(
" = "
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
scopeName
,
name
(),
init
.
simplifyWhiteSpace
());
linkifyText
(
TextGeneratorOLImpl
(
ol
),
container
,
name
(),
init
.
simplifyWhiteSpace
());
}
}
else
else
{
{
ol
.
writeNonBreakableSpace
(
3
);
ol
.
writeNonBreakableSpace
(
3
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
scopeName
,
name
(),
init
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
container
,
name
(),
init
);
}
}
}
}
if
(
excpString
())
// add exception list
if
(
excpString
())
// add exception list
{
{
ol
.
docify
(
" "
);
ol
.
docify
(
" "
);
linkifyText
(
TextGeneratorOLImpl
(
ol
),
scopeName
,
name
(),
excpString
());
linkifyText
(
TextGeneratorOLImpl
(
ol
),
container
,
name
(),
excpString
());
}
}
}
}
...
@@ -1808,10 +1804,17 @@ void MemberDef::addListReference(Definition *d)
...
@@ -1808,10 +1804,17 @@ void MemberDef::addListReference(Definition *d)
{
{
Definition
*
pd
=
getOuterScope
();
Definition
*
pd
=
getOuterScope
();
if
(
pd
&&
pd
!=
Doxygen
::
globalScope
)
if
(
pd
&&
pd
!=
Doxygen
::
globalScope
)
{
if
(
Config_getBool
(
"OPTIMIZE_OUTPUT_JAVA"
))
{
memName
.
prepend
(
pd
->
name
()
+
"."
);
}
else
{
{
memName
.
prepend
(
pd
->
name
()
+
"::"
);
memName
.
prepend
(
pd
->
name
()
+
"::"
);
}
}
}
}
}
//printf("*** addListReference %s todo=%d test=%d bug=%d\n",name().data(),todoId(),testId(),bugId());
//printf("*** addListReference %s todo=%d test=%d bug=%d\n",name().data(),todoId(),testId(),bugId());
addRefItem
(
xrefListItems
(),
memLabel
,
addRefItem
(
xrefListItems
(),
memLabel
,
d
->
getOutputFileBase
()
+
"#"
+
anchor
(),
memName
,
argsString
());
d
->
getOutputFileBase
()
+
"#"
+
anchor
(),
memName
,
argsString
());
...
...
src/pre.l
View file @
9e1745a1
...
@@ -1659,7 +1659,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
...
@@ -1659,7 +1659,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
}
}
<SkipCComment>"/*" {
<SkipCComment>"/*" {
outputChar('/');outputChar('*');
outputChar('/');outputChar('*');
g_commentCount++;
//
g_commentCount++;
}
}
<SkipCComment>[^*\n\/]+ {
<SkipCComment>[^*\n\/]+ {
outputArray(yytext,yyleng);
outputArray(yytext,yyleng);
...
...
src/scanner.l
View file @
9e1745a1
...
@@ -1731,6 +1731,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
...
@@ -1731,6 +1731,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
<CopyCurly>[^"'{}\/\n]+ {
<CopyCurly>[^"'{}\/\n]+ {
*pCopyCurlyString+=yytext;
*pCopyCurlyString+=yytext;
}
}
<CopyCurly>"/" { *pCopyCurlyString+=yytext; }
<CopyCurly>\n {
<CopyCurly>\n {
yyLineNr++;
yyLineNr++;
*pCopyCurlyString+=*yytext;
*pCopyCurlyString+=*yytext;
...
...
src/translator_hr.h
View file @
9e1745a1
...
@@ -49,11 +49,14 @@
...
@@ -49,11 +49,14 @@
//
//
// 2003/02/26
// 2003/02/26
// - Added strings for 1.2.18
// - Added strings for 1.2.18
//
// 2003/04/29
// - Added strings for 1.3.0
#ifndef TRANSLATOR_HR_H
#ifndef TRANSLATOR_HR_H
#define TRANSLATOR_HR_H
#define TRANSLATOR_HR_H
class
TranslatorCroatian
:
public
Translator
Adapter_1_3
class
TranslatorCroatian
:
public
Translator
{
{
private
:
private
:
/*! to avoid macro redefinition from translator_cz.h */
/*! to avoid macro redefinition from translator_cz.h */
...
@@ -887,12 +890,12 @@ class TranslatorCroatian : public TranslatorAdapter_1_3
...
@@ -887,12 +890,12 @@ class TranslatorCroatian : public TranslatorAdapter_1_3
/*! Used as a marker that is put before a \\bug item */
/*! Used as a marker that is put before a \\bug item */
virtual
QCString
trBug
()
virtual
QCString
trBug
()
{
{
return
decode
(
"Greka"
);
return
decode
(
"Greka"
);
}
}
/*! Used as the header of the bug list */
/*! Used as the header of the bug list */
virtual
QCString
trBugList
()
virtual
QCString
trBugList
()
{
{
return
decode
(
"Popis greaka"
);
return
decode
(
"Popis greaka"
);
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
...
@@ -1089,6 +1092,45 @@ class TranslatorCroatian : public TranslatorAdapter_1_3
...
@@ -1089,6 +1092,45 @@ class TranslatorCroatian : public TranslatorAdapter_1_3
{
{
return
decode
(
"Dokumentacija dogaaja"
);
return
decode
(
"Dokumentacija dogaaja"
);
}
}
//////////////////////////////////////////////////////////////////////////
// new since 1.3
//////////////////////////////////////////////////////////////////////////
/*! Used as a heading for a list of Java class types with package scope.
*/
virtual
QCString
trPackageTypes
()
{
return
"Tipovi u paketu"
;
}
/*! Used as a heading for a list of Java class functions with package
* scope.
*/
virtual
QCString
trPackageMembers
()
{
return
"Funkcije u paketu"
;
}
/*! Used as a heading for a list of static Java class functions with
* package scope.
*/
virtual
QCString
trStaticPackageMembers
()
{
return
decode
(
"Statike funkcije u paketu"
);
}
/*! Used as a heading for a list of Java class variables with package
* scope.
*/
virtual
QCString
trPackageAttribs
()
{
return
"Atributi u paketu"
;
}
/*! Used as a heading for a list of static Java class variables with
* package scope.
*/
virtual
QCString
trStaticPackageAttribs
()
{
return
decode
(
"Statiki atributi u paketu"
);
}
};
};
#endif
#endif
src/util.cpp
View file @
9e1745a1
...
@@ -416,10 +416,6 @@ QCString resolveTypeDef(Definition *context,const QCString &qualifiedName,
...
@@ -416,10 +416,6 @@ QCString resolveTypeDef(Definition *context,const QCString &qualifiedName,
{
{
resName
=
qualifiedName
.
right
(
qualifiedName
.
length
()
-
scopeIndex
-
2
);
resName
=
qualifiedName
.
right
(
qualifiedName
.
length
()
-
scopeIndex
-
2
);
}
}
else
{
resName
=
qualifiedName
;
}
MemberDef
*
md
=
0
;
MemberDef
*
md
=
0
;
while
(
mContext
&&
md
==
0
)
while
(
mContext
&&
md
==
0
)
{
{
...
@@ -445,6 +441,7 @@ QCString resolveTypeDef(Definition *context,const QCString &qualifiedName,
...
@@ -445,6 +441,7 @@ QCString resolveTypeDef(Definition *context,const QCString &qualifiedName,
ps
=
is
+
l
;
ps
=
is
+
l
;
}
}
}
}
//printf("resScope=%s\n",resScope?resScope->name().data():"<none>");
// step 2: get the member
// step 2: get the member
if
(
resScope
)
// no scope or scope found in the current context
if
(
resScope
)
// no scope or scope found in the current context
...
@@ -471,13 +468,18 @@ QCString resolveTypeDef(Definition *context,const QCString &qualifiedName,
...
@@ -471,13 +468,18 @@ QCString resolveTypeDef(Definition *context,const QCString &qualifiedName,
// tmd->name().data(), resScope->name().data(),
// tmd->name().data(), resScope->name().data(),
// tmd->getOuterScope()->name().data(), mContext);
// tmd->getOuterScope()->name().data(), mContext);
if
(
tmd
->
isTypedef
()
/*&& tmd->getOuterScope()==resScope*/
)
if
(
tmd
->
isTypedef
()
/*&& tmd->getOuterScope()==resScope*/
)
/*! TODO: look if resScope is visible within tmd->getOuterScope() */
{
// look if resScope is visible within tmd->getOuterScope()
Definition
*
d
=
tmd
->
getOuterScope
();
while
(
d
&&
d
!=
resScope
)
d
=
d
->
getOuterScope
();
if
(
d
)
{
{
md
=
tmd
;
md
=
tmd
;
}
}
}
}
}
}
}
}
}
mContext
=
mContext
->
getOuterScope
();
mContext
=
mContext
->
getOuterScope
();
}
}
...
@@ -544,13 +546,13 @@ ClassDef *getResolvedClass(
...
@@ -544,13 +546,13 @@ ClassDef *getResolvedClass(
QCString
name
=
n
;
QCString
name
=
n
;
if
(
scope
==
0
)
scope
=
Doxygen
::
globalScope
;
if
(
scope
==
0
)
scope
=
Doxygen
::
globalScope
;
if
(
name
.
isEmpty
())
return
0
;
if
(
name
.
isEmpty
())
return
0
;
//int index = name.findRev("::");
ClassDef
*
cd
=
0
;
ClassDef
*
cd
=
0
;
//printf("===================\n");
//printf("===================\n");
do
do
{
{
Definition
*
typedefScope
=
0
;
Definition
*
typedefScope
=
0
;
//printf("-----------------------------------------------------\n");
QCString
subst
=
resolveTypeDef
(
scope
,
name
,
&
typedefScope
);
QCString
subst
=
resolveTypeDef
(
scope
,
name
,
&
typedefScope
);
//printf("trying getResolvedClass(%s,%s) => subst=%s\n",
//printf("trying getResolvedClass(%s,%s) => subst=%s\n",
// scope ? scope->name().data() : "<none>", name.data(),subst.data());
// scope ? scope->name().data() : "<none>", name.data(),subst.data());
...
@@ -753,11 +755,12 @@ bool leftScopeMatch(const QCString &scope, const QCString &name)
...
@@ -753,11 +755,12 @@ bool leftScopeMatch(const QCString &scope, const QCString &name)
}
}
void
linkifyText
(
const
TextGeneratorIntf
&
out
,
const
char
*
scName
,
const
char
*
name
,
const
char
*
text
,
bool
autoBreak
,
bool
external
)
void
linkifyText
(
const
TextGeneratorIntf
&
out
,
Definition
*
scope
,
const
char
*
/*name*/
,
const
char
*
text
,
bool
autoBreak
,
bool
external
)
{
{
//printf("scope=`%s' name=`%s' Text: `%s'\n",scName,name,text);
//printf("scope=`%s' name=`%s' Text: `%s'\n",scName,name,text);
static
QRegExp
regExp
(
"[a-z_A-Z][a-z_A-Z0-9:]*"
);
static
QRegExp
regExp
(
"[a-z_A-Z][a-z_A-Z0-9:]*"
);
QCString
txtStr
=
text
;
QCString
txtStr
=
text
;
QCString
scopeName
;
int
strLen
=
txtStr
.
length
();
int
strLen
=
txtStr
.
length
();
//printf("linkifyText strtxt=%s strlen=%d\n",txtStr.data(),strLen);
//printf("linkifyText strtxt=%s strlen=%d\n",txtStr.data(),strLen);
int
matchLen
;
int
matchLen
;
...
@@ -803,39 +806,38 @@ void linkifyText(const TextGeneratorIntf &out,const char *scName,const char *nam
...
@@ -803,39 +806,38 @@ void linkifyText(const TextGeneratorIntf &out,const char *scName,const char *nam
NamespaceDef
*
nd
=
0
;
NamespaceDef
*
nd
=
0
;
GroupDef
*
gd
=
0
;
GroupDef
*
gd
=
0
;
QCString
scopeName
=
scName
;
//QCString searchName=name;
QCString
searchName
=
name
;
//printf("word=`%s' scope=`%s'\n",
//printf("word=`%s' scopeName=`%s' searchName=`%s'\n",
// word.data(),scope ? scope->name().data() : "<none>"
// word.data(),scopeName.data(),searchName.data()
// );
// );
Definition
*
curScope
=
scope
;
// check if `word' is a documented class name
// check if `word' is a documented class name
if
(
//!word.isEmpty() &&
if
(
//!(isdigit(word.at(0)) || word.at(0)=='-') &&
1
// // do not try to link digits
/* !rightScopeMatch(word,searchName) &&
// // (saves a lot of time for large arrays)
!rightScopeMatch(scopeName,word) */
!
rightScopeMatch
(
word
,
searchName
)
&&
!
rightScopeMatch
(
scopeName
,
word
)
)
)
{
{
//printf("Searching...\n");
//printf("Searching...\n");
int
scopeOffset
=
scopeName
.
length
();
//
int scopeOffset=scopeName.length();
bool
found
=
FALSE
;
bool
found
=
FALSE
;
do
// for each scope (starting with full scope and going to empty scope)
do
// for each scope (starting with full scope and going to empty scope)
{
{
QCString
fullName
=
word
;
QCString
fullName
=
word
;
QCString
prefix
;
QCString
prefix
;
replaceNamespaceAliases
(
fullName
,
fullName
.
length
());
replaceNamespaceAliases
(
fullName
,
fullName
.
length
());
if
(
scopeOffset
>
0
)
//if (scopeOffset>0)
if
(
curScope
)
{
{
//prefix = scopeName.left(scopeOffset);
prefix
=
scopeName
.
left
(
scopeOffset
);
prefix
=
curScope
->
name
(
);
replaceNamespaceAliases
(
prefix
,
scopeOffset
);
replaceNamespaceAliases
(
prefix
,
prefix
.
length
()
);
fullName
.
prepend
(
prefix
+
"::"
);
fullName
.
prepend
(
prefix
+
"::"
);
}
}
//printf("Trying class %s\n",fullName.data());
//printf("Trying class %s\n",fullName.data());
bool
isTypeDef
=
FALSE
;
bool
isTypeDef
=
FALSE
;
if
((
cd
=
getResolvedClass
(
Doxygen
::
globalS
cope
,
fullName
,
&
isTypeDef
)))
if
((
cd
=
getResolvedClass
(
s
cope
,
fullName
,
&
isTypeDef
)))
{
{
// add link to the result
// add link to the result
if
(
external
?
cd
->
isLinkable
()
:
cd
->
isLinkableInProject
())
if
(
external
?
cd
->
isLinkable
()
:
cd
->
isLinkableInProject
())
...
@@ -850,20 +852,30 @@ void linkifyText(const TextGeneratorIntf &out,const char *scName,const char *nam
...
@@ -850,20 +852,30 @@ void linkifyText(const TextGeneratorIntf &out,const char *scName,const char *nam
goto
endloop
;
goto
endloop
;
}
}
if
(
scopeOffset
==
0
)
//if (scopeOffset==0)
{
//{
scopeOffset
=-
1
;
// scopeOffset=-1;
}
//}
else
if
((
scopeOffset
=
scopeName
.
findRev
(
"::"
,
scopeOffset
-
1
))
==-
1
)
//else if ((scopeOffset=scopeName.findRev("::",scopeOffset-1))==-1)
{
//{
scopeOffset
=
0
;
// scopeOffset=0;
}
//}
}
while
(
!
found
&&
scopeOffset
>=
0
);
if
(
curScope
)
curScope
=
curScope
->
getOuterScope
();
}
//while (!found && scopeOffset>=0);
while
(
!
found
&&
curScope
);
endloop:
endloop:
if
(
scope
&&
(
scope
->
definitionType
()
==
Definition
::
TypeClass
||
scope
->
definitionType
()
==
Definition
::
TypeNamespace
)
)
{
scopeName
=
scope
->
name
();
}
//if (!found) printf("Trying to link %s in %s\n",word.data(),scName);
//if (!found) printf("Trying to link %s in %s\n",word.data(),scName);
if
(
!
found
&&
if
(
!
found
&&
getDefs
(
scName
,
word
,
0
,
md
,
cd
,
fd
,
nd
,
gd
)
&&
getDefs
(
sc
ope
Name
,
word
,
0
,
md
,
cd
,
fd
,
nd
,
gd
)
&&
(
md
->
isTypedef
()
||
md
->
isEnumerate
()
||
(
md
->
isTypedef
()
||
md
->
isEnumerate
()
||
md
->
isReference
()
||
md
->
isVariable
()
md
->
isReference
()
||
md
->
isVariable
()
)
&&
)
&&
...
@@ -2265,7 +2277,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
...
@@ -2265,7 +2277,7 @@ bool getDefs(const QCString &scName,const QCString &memberName,
{
{
fd
=
md
->
getFileDef
();
fd
=
md
->
getFileDef
();
gd
=
md
->
getGroupDef
();
gd
=
md
->
getGroupDef
();
//printf("md->name()=`%s' md->args=`%s' fd=%p gd=%p\n",
//printf("
md->name()=`%s' md->args=`%s' fd=%p gd=%p\n",
// md->name().data(),args,fd,gd);
// md->name().data(),args,fd,gd);
if
(
if
(
(
gd
&&
gd
->
isLinkable
())
||
(
fd
&&
fd
->
isLinkable
())
(
gd
&&
gd
->
isLinkable
())
||
(
fd
&&
fd
->
isLinkable
())
...
@@ -3416,14 +3428,14 @@ QCString substituteTemplateArgumentsInString(
...
@@ -3416,14 +3428,14 @@ QCString substituteTemplateArgumentsInString(
if
(
formArg
->
name
==
n
&&
actArg
&&
!
actArg
->
type
.
isEmpty
())
// base class is a template argument
if
(
formArg
->
name
==
n
&&
actArg
&&
!
actArg
->
type
.
isEmpty
())
// base class is a template argument
{
{
// replace formal argument with the actual argument of the instance
// replace formal argument with the actual argument of the instance
result
+=
actArg
->
type
;
result
+=
actArg
->
type
+
" "
;
found
=
TRUE
;
found
=
TRUE
;
}
}
else
if
(
formArg
->
name
==
n
&&
actArg
==
0
&&
!
formArg
->
defval
.
isEmpty
()
&&
else
if
(
formArg
->
name
==
n
&&
actArg
==
0
&&
!
formArg
->
defval
.
isEmpty
()
&&
formArg
->
defval
!=
name
/* to prevent recursion */
formArg
->
defval
!=
name
/* to prevent recursion */
)
)
{
{
result
+=
substituteTemplateArgumentsInString
(
formArg
->
defval
,
formalArgs
,
actualArgs
);
result
+=
substituteTemplateArgumentsInString
(
formArg
->
defval
,
formalArgs
,
actualArgs
)
+
" "
;
found
=
TRUE
;
found
=
TRUE
;
}
}
}
}
...
...
src/util.h
View file @
9e1745a1
...
@@ -76,7 +76,7 @@ class TextGeneratorOLImpl : public TextGeneratorIntf
...
@@ -76,7 +76,7 @@ class TextGeneratorOLImpl : public TextGeneratorIntf
//--------------------------------------------------------------------
//--------------------------------------------------------------------
void
linkifyText
(
const
TextGeneratorIntf
&
ol
,
const
char
*
clNam
e
,
const
char
*
name
,
void
linkifyText
(
const
TextGeneratorIntf
&
ol
,
Definition
*
scop
e
,
const
char
*
name
,
const
char
*
text
,
bool
autoBreak
=
FALSE
,
bool
external
=
TRUE
);
const
char
*
text
,
bool
autoBreak
=
FALSE
,
bool
external
=
TRUE
);
void
setAnchors
(
ClassDef
*
cd
,
char
id
,
MemberList
*
ml
,
int
groupId
=-
1
);
void
setAnchors
(
ClassDef
*
cd
,
char
id
,
MemberList
*
ml
,
int
groupId
=-
1
);
QCString
fileToString
(
const
char
*
name
,
bool
filter
=
FALSE
);
QCString
fileToString
(
const
char
*
name
,
bool
filter
=
FALSE
);
...
...
src/xmlgen.cpp
View file @
9e1745a1
...
@@ -320,7 +320,7 @@ class XMLCodeGenerator : public BaseCodeDocInterface
...
@@ -320,7 +320,7 @@ class XMLCodeGenerator : public BaseCodeDocInterface
};
};
static
void
writeTemplateArgumentList
(
ArgumentList
*
al
,
QTextStream
&
t
,
const
char
*
nam
e
,
int
indent
)
static
void
writeTemplateArgumentList
(
ArgumentList
*
al
,
QTextStream
&
t
,
Definition
*
scop
e
,
int
indent
)
{
{
QCString
indentStr
;
QCString
indentStr
;
indentStr
.
fill
(
' '
,
indent
);
indentStr
.
fill
(
' '
,
indent
);
...
@@ -335,7 +335,7 @@ static void writeTemplateArgumentList(ArgumentList *al,QTextStream &t,const char
...
@@ -335,7 +335,7 @@ static void writeTemplateArgumentList(ArgumentList *al,QTextStream &t,const char
if
(
!
a
->
type
.
isEmpty
())
if
(
!
a
->
type
.
isEmpty
())
{
{
t
<<
indentStr
<<
" <type>"
;
t
<<
indentStr
<<
" <type>"
;
linkifyText
(
TextGeneratorXMLImpl
(
t
),
nam
e
,
0
,
a
->
type
);
linkifyText
(
TextGeneratorXMLImpl
(
t
),
scop
e
,
0
,
a
->
type
);
t
<<
"</type>"
<<
endl
;
t
<<
"</type>"
<<
endl
;
}
}
if
(
!
a
->
name
.
isEmpty
())
if
(
!
a
->
name
.
isEmpty
())
...
@@ -346,7 +346,7 @@ static void writeTemplateArgumentList(ArgumentList *al,QTextStream &t,const char
...
@@ -346,7 +346,7 @@ static void writeTemplateArgumentList(ArgumentList *al,QTextStream &t,const char
if
(
!
a
->
defval
.
isEmpty
())
if
(
!
a
->
defval
.
isEmpty
())
{
{
t
<<
indentStr
<<
" <defval>"
;
t
<<
indentStr
<<
" <defval>"
;
linkifyText
(
TextGeneratorXMLImpl
(
t
),
nam
e
,
0
,
a
->
defval
);
linkifyText
(
TextGeneratorXMLImpl
(
t
),
scop
e
,
0
,
a
->
defval
);
t
<<
"</defval>"
<<
endl
;
t
<<
"</defval>"
<<
endl
;
}
}
t
<<
indentStr
<<
" </param>"
<<
endl
;
t
<<
indentStr
<<
" </param>"
<<
endl
;
...
@@ -357,17 +357,15 @@ static void writeTemplateArgumentList(ArgumentList *al,QTextStream &t,const char
...
@@ -357,17 +357,15 @@ static void writeTemplateArgumentList(ArgumentList *al,QTextStream &t,const char
static
void
writeMemberTemplateLists
(
MemberDef
*
md
,
QTextStream
&
t
)
static
void
writeMemberTemplateLists
(
MemberDef
*
md
,
QTextStream
&
t
)
{
{
ClassDef
*
cd
=
md
->
getClassDef
();
const
char
*
cname
=
cd
?
cd
->
name
().
data
()
:
0
;
if
(
md
->
templateArguments
())
// function template prefix
if
(
md
->
templateArguments
())
// function template prefix
{
{
writeTemplateArgumentList
(
md
->
templateArguments
(),
t
,
cname
,
8
);
writeTemplateArgumentList
(
md
->
templateArguments
(),
t
,
md
->
getClassDef
()
,
8
);
}
}
}
}
static
void
writeTemplateList
(
ClassDef
*
cd
,
QTextStream
&
t
)
static
void
writeTemplateList
(
ClassDef
*
cd
,
QTextStream
&
t
)
{
{
writeTemplateArgumentList
(
cd
->
templateArguments
(),
t
,
cd
->
name
()
,
4
);
writeTemplateArgumentList
(
cd
->
templateArguments
(),
t
,
cd
,
4
);
}
}
static
void
writeXMLDocBlock
(
QTextStream
&
t
,
static
void
writeXMLDocBlock
(
QTextStream
&
t
,
...
@@ -556,7 +554,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De
...
@@ -556,7 +554,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De
}
}
QCString
typeStr
=
md
->
typeString
();
//replaceAnonymousScopes(md->typeString());
QCString
typeStr
=
md
->
typeString
();
//replaceAnonymousScopes(md->typeString());
t
<<
" <type>"
;
t
<<
" <type>"
;
linkifyText
(
TextGeneratorXMLImpl
(
t
),
scopeName
,
md
->
name
(),
typeStr
);
linkifyText
(
TextGeneratorXMLImpl
(
t
),
def
,
md
->
name
(),
typeStr
);
t
<<
"</type>"
<<
endl
;
t
<<
"</type>"
<<
endl
;
t
<<
" <definition>"
<<
convertToXML
(
md
->
definition
())
<<
"</definition>"
<<
endl
;
t
<<
" <definition>"
<<
convertToXML
(
md
->
definition
())
<<
"</definition>"
<<
endl
;
t
<<
" <argsstring>"
<<
convertToXML
(
md
->
argsString
())
<<
"</argsstring>"
<<
endl
;
t
<<
" <argsstring>"
<<
convertToXML
(
md
->
argsString
())
<<
"</argsstring>"
<<
endl
;
...
@@ -604,7 +602,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De
...
@@ -604,7 +602,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De
if
(
!
a
->
type
.
isEmpty
())
if
(
!
a
->
type
.
isEmpty
())
{
{
t
<<
" <type>"
;
t
<<
" <type>"
;
linkifyText
(
TextGeneratorXMLImpl
(
t
),
scopeName
,
md
->
name
(),
a
->
type
);
linkifyText
(
TextGeneratorXMLImpl
(
t
),
def
,
md
->
name
(),
a
->
type
);
t
<<
"</type>"
<<
endl
;
t
<<
"</type>"
<<
endl
;
}
}
if
(
!
a
->
name
.
isEmpty
())
if
(
!
a
->
name
.
isEmpty
())
...
@@ -628,7 +626,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De
...
@@ -628,7 +626,7 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De
if
(
!
a
->
defval
.
isEmpty
())
if
(
!
a
->
defval
.
isEmpty
())
{
{
t
<<
" <defval>"
;
t
<<
" <defval>"
;
linkifyText
(
TextGeneratorXMLImpl
(
t
),
scopeName
,
md
->
name
(),
a
->
defval
);
linkifyText
(
TextGeneratorXMLImpl
(
t
),
def
,
md
->
name
(),
a
->
defval
);
t
<<
"</defval>"
<<
endl
;
t
<<
"</defval>"
<<
endl
;
}
}
if
(
defArg
&&
defArg
->
hasDocumentation
())
if
(
defArg
&&
defArg
->
hasDocumentation
())
...
@@ -656,14 +654,14 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De
...
@@ -656,14 +654,14 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De
if
(
!
md
->
initializer
().
isEmpty
())
if
(
!
md
->
initializer
().
isEmpty
())
{
{
t
<<
" <initializer>"
;
t
<<
" <initializer>"
;
linkifyText
(
TextGeneratorXMLImpl
(
t
),
scopeName
,
md
->
name
(),
md
->
initializer
());
linkifyText
(
TextGeneratorXMLImpl
(
t
),
def
,
md
->
name
(),
md
->
initializer
());
t
<<
"</initializer>"
<<
endl
;
t
<<
"</initializer>"
<<
endl
;
}
}
if
(
md
->
excpString
())
if
(
md
->
excpString
())
{
{
t
<<
" <exceptions>"
;
t
<<
" <exceptions>"
;
linkifyText
(
TextGeneratorXMLImpl
(
t
),
scopeName
,
md
->
name
(),
md
->
excpString
());
linkifyText
(
TextGeneratorXMLImpl
(
t
),
def
,
md
->
name
(),
md
->
excpString
());
t
<<
"</exceptions>"
<<
endl
;
t
<<
"</exceptions>"
<<
endl
;
}
}
...
@@ -983,7 +981,7 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &ti)
...
@@ -983,7 +981,7 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &ti)
t
<<
" <detaileddescription>"
<<
endl
;
t
<<
" <detaileddescription>"
<<
endl
;
writeXMLDocBlock
(
t
,
cd
->
docFile
(),
cd
->
docLine
(),
cd
->
name
(),
0
,
cd
->
documentation
());
writeXMLDocBlock
(
t
,
cd
->
docFile
(),
cd
->
docLine
(),
cd
->
name
(),
0
,
cd
->
documentation
());
t
<<
" </detaileddescription>"
<<
endl
;
t
<<
" </detaileddescription>"
<<
endl
;
DotClassGraph
inheritanceGraph
(
cd
,
Dot
ClassGraph
::
Inheritance
,
DotClassGraph
inheritanceGraph
(
cd
,
Dot
Node
::
Inheritance
,
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
));
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
));
if
(
!
inheritanceGraph
.
isTrivial
())
if
(
!
inheritanceGraph
.
isTrivial
())
{
{
...
@@ -991,7 +989,7 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &ti)
...
@@ -991,7 +989,7 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &ti)
inheritanceGraph
.
writeXML
(
t
);
inheritanceGraph
.
writeXML
(
t
);
t
<<
" </inheritancegraph>"
<<
endl
;
t
<<
" </inheritancegraph>"
<<
endl
;
}
}
DotClassGraph
collaborationGraph
(
cd
,
Dot
ClassGraph
::
Implement
ation
,
DotClassGraph
collaborationGraph
(
cd
,
Dot
Node
::
Collabor
ation
,
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
));
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
));
if
(
!
collaborationGraph
.
isTrivial
())
if
(
!
collaborationGraph
.
isTrivial
())
{
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment