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
7e0aeda8
Commit
7e0aeda8
authored
Apr 12, 2003
by
Dimitri van Heesch
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Release-1.3
parent
b69146af
Changes
21
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
340 additions
and
277 deletions
+340
-277
INSTALL
INSTALL
+2
-2
README
README
+2
-2
VERSION
VERSION
+1
-1
index.doc
doc/index.doc
+1
-1
language.doc
doc/language.doc
+1
-1
starting.doc
doc/starting.doc
+1
-0
doxygen.spec
packages/rpm/doxygen.spec
+1
-1
code.l
src/code.l
+12
-1
config.l
src/config.l
+15
-2
docparser.cpp
src/docparser.cpp
+8
-1
docparser.h
src/docparser.h
+177
-173
dot.cpp
src/dot.cpp
+0
-19
dot.h
src/dot.h
+1
-1
doxygen.cpp
src/doxygen.cpp
+58
-17
filedef.cpp
src/filedef.cpp
+2
-2
htmldocvisitor.cpp
src/htmldocvisitor.cpp
+3
-0
memberdef.cpp
src/memberdef.cpp
+1
-0
translator_pl.h
src/translator_pl.h
+15
-15
util.cpp
src/util.cpp
+8
-1
util.h
src/util.h
+27
-33
xmlgen.cpp
src/xmlgen.cpp
+4
-4
No files found.
INSTALL
View file @
7e0aeda8
DOXYGEN Version 1.3
-rc3-20030330
DOXYGEN Version 1.3
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 (
30 March
2003)
Dimitri van Heesch (
10 April
2003)
README
View file @
7e0aeda8
DOXYGEN Version 1.3
_rc3_20030330
DOXYGEN Version 1.3
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) (
30 March
2003)
Dimitri van Heesch (dimitri@stack.nl) (
10 April
2003)
VERSION
View file @
7e0aeda8
1.3
-rc3-20030330
1.3
doc/index.doc
View file @
7e0aeda8
...
@@ -39,7 +39,7 @@ It can help you in three ways:
...
@@ -39,7 +39,7 @@ It can help you in three ways:
The documentation is extracted directly from the sources, which
The documentation is extracted directly from the sources, which
makes it much easier to keep the documentation consistent with the
makes it much easier to keep the documentation consistent with the
source code.
source code.
<li> You can
configure
doxygen to extract the code structure
<li> You can
\ref extract_all "configure"
doxygen to extract the code structure
from undocumented source files. This is very useful to quickly
from undocumented source files. This is very useful to quickly
find your way in large source distributions.
find your way in large source distributions.
You can also visualize the relations between the various elements
You can also visualize the relations between the various elements
...
...
doc/language.doc
View file @
7e0aeda8
...
@@ -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.
3-rc3-2003032
7), 28 languages
Currently (version 1.
2.14-2002031
7), 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,
...
...
doc/starting.doc
View file @
7e0aeda8
...
@@ -102,6 +102,7 @@ written in Java. Files ending with <code>.cs</code> are treated as C# files.
...
@@ -102,6 +102,7 @@ written in Java. Files ending with <code>.cs</code> are treated as C# files.
Finally, files with the extensions <code>.php</code>, <code>.php4</code>,
Finally, files with the extensions <code>.php</code>, <code>.php4</code>,
<code>.inc</code> or <code>.phtml</code> are treated as PHP sources.
<code>.inc</code> or <code>.phtml</code> are treated as PHP sources.
\anchor extract_all
If you start using doxygen for an existing project (thus without any
If you start using doxygen for an existing project (thus without any
documentation that doxygen is aware of), you can still get an idea of
documentation that doxygen is aware of), you can still get an idea of
what the documented result would be. To do so, you must set
what the documented result would be. To do so, you must set
...
...
packages/rpm/doxygen.spec
View file @
7e0aeda8
Summary: A documentation system for C/C++.
Summary: A documentation system for C/C++.
Name: doxygen
Name: doxygen
Version: 1.3
_rc3_20030330
Version: 1.3
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/code.l
View file @
7e0aeda8
...
@@ -672,6 +672,7 @@ static void generateClassOrGlobalLink(BaseCodeDocInterface &ol,char *clName,
...
@@ -672,6 +672,7 @@ static void generateClassOrGlobalLink(BaseCodeDocInterface &ol,char *clName,
}
}
else
else
{
{
//printf("typeOnly=%d\n",typeOnly);
if (cd==0 && !typeOnly) // not a class, see if it is a global enum/variable/typedef.
if (cd==0 && !typeOnly) // not a class, see if it is a global enum/variable/typedef.
{
{
MemberDef *md = setCallContextForVar(clName);
MemberDef *md = setCallContextForVar(clName);
...
@@ -1556,7 +1557,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
...
@@ -1556,7 +1557,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
<MemberCall2,FuncCall>[a-z_A-Z][:a-z_A-Z0-9]*({B}*"<"[^\n\<\>]*">")? {
<MemberCall2,FuncCall>[a-z_A-Z][:a-z_A-Z0-9]*({B}*"<"[^\n\<\>]*">")? {
addParmType();
addParmType();
g_parmName=yytext;
g_parmName=yytext;
generateClassOrGlobalLink(*g_code,yytext,
TRUE
);
generateClassOrGlobalLink(*g_code,yytext,
!g_insideBody
);
}
}
<MemberCall2,FuncCall>, {
<MemberCall2,FuncCall>, {
g_code->codify(yytext);
g_code->codify(yytext);
...
@@ -1798,6 +1799,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
...
@@ -1798,6 +1799,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
codifyLines(yytext);
codifyLines(yytext);
endFontClass();
endFontClass();
}
}
if (YY_START==SkipCxxComment)
{
endFontClass();
BEGIN( g_lastCContext ) ;
}
}
}
<*>\n{B}*"//@"[{}].*\n { // remove one-line group marker
<*>\n{B}*"//@"[{}].*\n { // remove one-line group marker
if (Config_getBool("STRIP_CODE_COMMENTS"))
if (Config_getBool("STRIP_CODE_COMMENTS"))
...
@@ -1815,6 +1821,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
...
@@ -1815,6 +1821,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
codifyLines(yytext);
codifyLines(yytext);
endFontClass();
endFontClass();
}
}
if (YY_START==SkipCxxComment)
{
endFontClass();
BEGIN( g_lastCContext ) ;
}
}
}
<*>\n{B}*"/*@"[{}] { // remove one-line group marker
<*>\n{B}*"/*@"[{}] { // remove one-line group marker
if (Config_getBool("STRIP_CODE_COMMENTS"))
if (Config_getBool("STRIP_CODE_COMMENTS"))
...
...
src/config.l
View file @
7e0aeda8
...
@@ -2371,8 +2371,21 @@ void Config::create()
...
@@ -2371,8 +2371,21 @@ void Config::create()
//-----------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------
cl = addList(
cl = addList(
"TAGFILES",
"TAGFILES",
"The TAGFILES tag can be used to specify one or more tagfiles. \n"
"The TAGFILES option can be used to specify one or more tagfiles. \n"
);
"Optionally an initial location of the external documentation \n"
"can be added for each tagfile. The format of a tag file without \n"
"this location is as follows: \n"
" TAGFILES = file1 file2 ... \n"
"Adding location for the tag files is done as follows: \n"
" TAGFILES = file1=loc1 \"file2 = loc2\" ... \n"
"where \"loc1\" and \"loc2\" can be relative or absolute paths or \n"
"URLs. If a location is present for each tag, the installdox tool \n"
"does not have to be run to correct the links.\n"
"Note that each tag file must have a unique name\n"
"(where the name does NOT include the path)\n"
"If a tag file is not located in the directory in which doxygen \n"
"is run, you must also specify the path to the tagfile here. \n"
);
cl->setWidgetType(ConfigList::File);
cl->setWidgetType(ConfigList::File);
cs = addString(
cs = addString(
"GENERATE_TAGFILE",
"GENERATE_TAGFILE",
...
...
src/docparser.cpp
View file @
7e0aeda8
...
@@ -1175,6 +1175,7 @@ DocAnchor::DocAnchor(DocNode *parent,const QString &id,bool newAnchor)
...
@@ -1175,6 +1175,7 @@ DocAnchor::DocAnchor(DocNode *parent,const QString &id,bool newAnchor)
void
DocInclude
::
parse
()
void
DocInclude
::
parse
()
{
{
DBG
((
"DocInclude::parse(file=%s,text=%s)
\n
"
,
m_file
.
data
(),
m_text
.
data
()));
switch
(
m_type
)
switch
(
m_type
)
{
{
case
Include
:
case
Include
:
...
@@ -1184,6 +1185,7 @@ void DocInclude::parse()
...
@@ -1184,6 +1185,7 @@ void DocInclude::parse()
g_includeFileText
=
m_text
;
g_includeFileText
=
m_text
;
g_includeFileOffset
=
0
;
g_includeFileOffset
=
0
;
g_includeFileLength
=
m_text
.
length
();
g_includeFileLength
=
m_text
.
length
();
//printf("g_includeFile=<<%s>>\n",g_includeFileText.data());
break
;
break
;
case
VerbInclude
:
case
VerbInclude
:
// fall through
// fall through
...
@@ -1200,7 +1202,7 @@ void DocIncOperator::parse()
...
@@ -1200,7 +1202,7 @@ void DocIncOperator::parse()
const
char
*
p
=
g_includeFileText
;
const
char
*
p
=
g_includeFileText
;
uint
l
=
g_includeFileLength
;
uint
l
=
g_includeFileLength
;
uint
o
=
g_includeFileOffset
;
uint
o
=
g_includeFileOffset
;
//printf("DocIncOperator::parse() text=%s off=%d len=%d\n",p,o,l
);
DBG
((
"DocIncOperator::parse() text=%s off=%d len=%d
\n
"
,
p
,
o
,
l
)
);
uint
so
=
o
,
bo
;
uint
so
=
o
,
bo
;
bool
nonEmpty
=
FALSE
;
bool
nonEmpty
=
FALSE
;
switch
(
type
())
switch
(
type
())
...
@@ -1223,6 +1225,7 @@ void DocIncOperator::parse()
...
@@ -1223,6 +1225,7 @@ void DocIncOperator::parse()
if
(
g_includeFileText
.
mid
(
so
,
o
-
so
).
find
(
m_pattern
)
!=-
1
)
if
(
g_includeFileText
.
mid
(
so
,
o
-
so
).
find
(
m_pattern
)
!=-
1
)
{
{
m_text
=
g_includeFileText
.
mid
(
so
,
o
-
so
);
m_text
=
g_includeFileText
.
mid
(
so
,
o
-
so
);
DBG
((
"DocIncOperator::parse() Line: %s
\n
"
,
m_text
.
data
()));
}
}
g_includeFileOffset
=
QMIN
(
l
,
o
+
1
);
// set pointer to start of new line
g_includeFileOffset
=
QMIN
(
l
,
o
+
1
);
// set pointer to start of new line
break
;
break
;
...
@@ -1247,6 +1250,7 @@ void DocIncOperator::parse()
...
@@ -1247,6 +1250,7 @@ void DocIncOperator::parse()
if
(
g_includeFileText
.
mid
(
so
,
o
-
so
).
find
(
m_pattern
)
!=-
1
)
if
(
g_includeFileText
.
mid
(
so
,
o
-
so
).
find
(
m_pattern
)
!=-
1
)
{
{
m_text
=
g_includeFileText
.
mid
(
so
,
o
-
so
);
m_text
=
g_includeFileText
.
mid
(
so
,
o
-
so
);
DBG
((
"DocIncOperator::parse() SkipLine: %s
\n
"
,
m_text
.
data
()));
break
;
break
;
}
}
o
++
;
// skip new line
o
++
;
// skip new line
...
@@ -1301,6 +1305,7 @@ void DocIncOperator::parse()
...
@@ -1301,6 +1305,7 @@ void DocIncOperator::parse()
if
(
g_includeFileText
.
mid
(
so
,
o
-
so
).
find
(
m_pattern
)
!=-
1
)
if
(
g_includeFileText
.
mid
(
so
,
o
-
so
).
find
(
m_pattern
)
!=-
1
)
{
{
m_text
=
g_includeFileText
.
mid
(
bo
,
o
-
bo
);
m_text
=
g_includeFileText
.
mid
(
bo
,
o
-
bo
);
DBG
((
"DocIncOperator::parse() Until: %s
\n
"
,
m_text
.
data
()));
break
;
break
;
}
}
o
++
;
// skip new line
o
++
;
// skip new line
...
@@ -3129,6 +3134,7 @@ int DocPara::handleXRefItem(DocXRefItem::Type t)
...
@@ -3129,6 +3134,7 @@ int DocPara::handleXRefItem(DocXRefItem::Type t)
void
DocPara
::
handleIncludeOperator
(
const
QString
&
cmdName
,
DocIncOperator
::
Type
t
)
void
DocPara
::
handleIncludeOperator
(
const
QString
&
cmdName
,
DocIncOperator
::
Type
t
)
{
{
DBG
((
"handleIncludeOperator(%s)
\n
"
,
cmdName
.
data
()));
int
tok
=
doctokenizerYYlex
();
int
tok
=
doctokenizerYYlex
();
if
(
tok
!=
TK_WHITESPACE
)
if
(
tok
!=
TK_WHITESPACE
)
{
{
...
@@ -3349,6 +3355,7 @@ endlang:
...
@@ -3349,6 +3355,7 @@ endlang:
void
DocPara
::
handleInclude
(
const
QString
&
cmdName
,
DocInclude
::
Type
t
)
void
DocPara
::
handleInclude
(
const
QString
&
cmdName
,
DocInclude
::
Type
t
)
{
{
DBG
((
"handleInclude(%s)
\n
"
,
cmdName
.
data
()));
int
tok
=
doctokenizerYYlex
();
int
tok
=
doctokenizerYYlex
();
if
(
tok
!=
TK_WHITESPACE
)
if
(
tok
!=
TK_WHITESPACE
)
{
{
...
...
src/docparser.h
View file @
7e0aeda8
This diff is collapsed.
Click to expand it.
src/dot.cpp
View file @
7e0aeda8
...
@@ -964,25 +964,6 @@ DotGfxHierarchyTable::~DotGfxHierarchyTable()
...
@@ -964,25 +964,6 @@ DotGfxHierarchyTable::~DotGfxHierarchyTable()
{
{
//printf("DotGfxHierarchyTable::~DotGfxHierarchyTable\n");
//printf("DotGfxHierarchyTable::~DotGfxHierarchyTable\n");
#if 0 // TODO: delete this
SDict<DotNode> skipNodes(1009);
skipNodes.setAutoDelete(TRUE);
DotNode *n = m_rootNodes->first();
while (n)
{
//printf("adding %s %p\n",n->label().data(),n);
skipNodes.append((char*)n,n);
n=m_rootNodes->next();
}
n = m_rootNodes->first();
while (n)
{
//printf("Deleting root node %s\n",n->label().data());
deleteNodes(n,&skipNodes);
n=m_rootNodes->next();
}
#endif
//QDictIterator<DotNode> di(*m_usedNodes);
//QDictIterator<DotNode> di(*m_usedNodes);
//DotNode *n;
//DotNode *n;
//for (;(n=di.current());++di)
//for (;(n=di.current());++di)
...
...
src/dot.h
View file @
7e0aeda8
...
@@ -152,7 +152,7 @@ class DotClassGraph
...
@@ -152,7 +152,7 @@ class DotClassGraph
class
DotInclDepGraph
class
DotInclDepGraph
{
{
public
:
public
:
DotInclDepGraph
(
FileDef
*
fd
,
int
maxRecusionDepth
,
bool
inverse
=
FALSE
);
DotInclDepGraph
(
FileDef
*
fd
,
int
maxRecusionDepth
,
bool
inverse
);
~
DotInclDepGraph
();
~
DotInclDepGraph
();
QCString
writeGraph
(
QTextStream
&
t
,
GraphOutputFormat
f
,
const
char
*
path
,
QCString
writeGraph
(
QTextStream
&
t
,
GraphOutputFormat
f
,
const
char
*
path
,
bool
writeImageMap
=
TRUE
);
bool
writeImageMap
=
TRUE
);
...
...
src/doxygen.cpp
View file @
7e0aeda8
...
@@ -799,20 +799,20 @@ static void addClassToContext(Entry *root)
...
@@ -799,20 +799,20 @@ static void addClassToContext(Entry *root)
Doxygen
::
classSDict
.
append
(
fullName
,
cd
);
Doxygen
::
classSDict
.
append
(
fullName
,
cd
);
// also add class to the correct structural context
// also add class to the correct structural context
Definition
*
d
=
findScopeFromQualifiedName
(
Doxygen
::
globalScope
,
fullName
);
//
Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,fullName);
if
(
d
==
0
)
//
if (d==0)
{
//
{
//
warn(root->fileName,root->startLine,
//
warn(root->fileName,root->startLine,
//
"Warning: Internal inconsistency: scope for class %s not "
//
"Warning: Internal inconsistency: scope for class %s not "
//
"found!\n",fullName.data()
//
"found!\n",fullName.data()
//
);
//
);
}
//
}
else
//
else
{
//
{
//printf("****** adding %s to scope %s\n",cd->name().data(),d->name().data());
//
//printf("****** adding %s to scope %s\n",cd->name().data(),d->name().data());
d
->
addInnerCompound
(
cd
);
//
d->addInnerCompound(cd);
cd
->
setOuterScope
(
d
);
//
cd->setOuterScope(d);
}
//
}
}
}
}
}
...
@@ -850,6 +850,46 @@ static void buildClassDocList(Entry *root)
...
@@ -850,6 +850,46 @@ static void buildClassDocList(Entry *root)
buildClassDocList
(
e
);
buildClassDocList
(
e
);
}
}
}
}
static
void
resolveClassNestingRelations
()
{
int
nestingLevel
=
0
;
bool
done
=
FALSE
;
while
(
!
done
)
{
// iterate over all classes searching for a class with right nesting
// level (starting with 0 and going up until no more classes are found)
done
=
TRUE
;
ClassSDict
::
Iterator
cli
(
Doxygen
::
classSDict
);
ClassDef
*
cd
=
0
;
for
(
cli
.
toFirst
();(
cd
=
cli
.
current
());
++
cli
)
{
if
(
cd
->
name
().
contains
(
"::"
)
==
nestingLevel
)
{
//printf("Level=%d processing=%s\n",nestingLevel,cd->name().data());
done
=
FALSE
;
// also add class to the correct structural context
Definition
*
d
=
findScopeFromQualifiedName
(
Doxygen
::
globalScope
,
cd
->
name
());
if
(
d
==
0
)
{
warn
(
cd
->
getDefFileName
(),
cd
->
getDefLine
(),
"Warning: Internal inconsistency: scope for class %s not "
"found!
\n
"
,
cd
->
name
().
data
()
);
}
else
{
//printf("****** adding %s to scope %s\n",cd->name().data(),d->name().data());
d
->
addInnerCompound
(
cd
);
cd
->
setOuterScope
(
d
);
}
}
}
nestingLevel
++
;
}
}
//----------------------------------------------------------------------
//----------------------------------------------------------------------
// build a list of all namespaces mentioned in the documentation
// build a list of all namespaces mentioned in the documentation
// and all namespaces that have a documentation block before their definition.
// and all namespaces that have a documentation block before their definition.
...
@@ -1710,7 +1750,7 @@ done:
...
@@ -1710,7 +1750,7 @@ done:
// Searches the Entry tree for Variable documentation sections.
// Searches the Entry tree for Variable documentation sections.
// If found they are stored in their class or in the global list.
// If found they are stored in their class or in the global list.
void
buildVarList
(
Entry
*
root
)
static
void
buildVarList
(
Entry
*
root
)
{
{
if
(
!
root
->
name
.
isEmpty
()
&&
if
(
!
root
->
name
.
isEmpty
()
&&
(
root
->
type
.
isEmpty
()
||
compoundKeywordDict
.
find
(
root
->
type
)
==
0
)
&&
(
root
->
type
.
isEmpty
()
||
compoundKeywordDict
.
find
(
root
->
type
)
==
0
)
&&
...
@@ -1914,7 +1954,7 @@ nextMember:
...
@@ -1914,7 +1954,7 @@ nextMember:
// Searches the Entry tree for Function sections.
// Searches the Entry tree for Function sections.
// If found they are stored in their class or in the global list.
// If found they are stored in their class or in the global list.
void
addMethodToClass
(
Entry
*
root
,
ClassDef
*
cd
,
static
void
addMethodToClass
(
Entry
*
root
,
ClassDef
*
cd
,
const
QCString
&
rname
,
/*const QCString &scope,*/
bool
isFriend
)
const
QCString
&
rname
,
/*const QCString &scope,*/
bool
isFriend
)
{
{
int
l
,
i
;
int
l
,
i
;
...
@@ -2790,7 +2830,7 @@ static QDict<int> *getTemplateArgumentsInName(ArgumentList *templateArguments,co
...
@@ -2790,7 +2830,7 @@ static QDict<int> *getTemplateArgumentsInName(ArgumentList *templateArguments,co
* This function differs from getResolvedClass in that it also takes
* This function differs from getResolvedClass in that it also takes
* using declarations and definition into account.
* using declarations and definition into account.
*/
*/
ClassDef
*
findClassWithinClassContext
(
ClassDef
*
cd
,
const
QCString
&
name
)
static
ClassDef
*
findClassWithinClassContext
(
ClassDef
*
cd
,
const
QCString
&
name
)
{
{
ClassDef
*
result
=
0
;
ClassDef
*
result
=
0
;
...
@@ -7861,6 +7901,7 @@ void parseInput()
...
@@ -7861,6 +7901,7 @@ void parseInput()
msg
(
"Building class list...
\n
"
);
msg
(
"Building class list...
\n
"
);
buildClassList
(
root
);
buildClassList
(
root
);
buildClassDocList
(
root
);
buildClassDocList
(
root
);
resolveClassNestingRelations
();
findUsingDeclarations
(
root
);
findUsingDeclarations
(
root
);
msg
(
"Building example list...
\n
"
);
msg
(
"Building example list...
\n
"
);
...
...
src/filedef.cpp
View file @
7e0aeda8
...
@@ -310,7 +310,7 @@ void FileDef::writeDocumentation(OutputList &ol)
...
@@ -310,7 +310,7 @@ void FileDef::writeDocumentation(OutputList &ol)
if
(
Config_getBool
(
"HAVE_DOT"
)
&&
Config_getBool
(
"INCLUDE_GRAPH"
))
if
(
Config_getBool
(
"HAVE_DOT"
)
&&
Config_getBool
(
"INCLUDE_GRAPH"
))
{
{
//printf("Graph for file %s\n",name().data());
//printf("Graph for file %s\n",name().data());
DotInclDepGraph
incDepGraph
(
this
,
FALSE
);
DotInclDepGraph
incDepGraph
(
this
,
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
),
FALSE
);
if
(
!
incDepGraph
.
isTrivial
())
if
(
!
incDepGraph
.
isTrivial
())
{
{
ol
.
disable
(
OutputGenerator
::
Man
);
ol
.
disable
(
OutputGenerator
::
Man
);
...
@@ -326,7 +326,7 @@ void FileDef::writeDocumentation(OutputList &ol)
...
@@ -326,7 +326,7 @@ void FileDef::writeDocumentation(OutputList &ol)
if
(
Config_getBool
(
"HAVE_DOT"
)
&&
Config_getBool
(
"INCLUDED_BY_GRAPH"
))
if
(
Config_getBool
(
"HAVE_DOT"
)
&&
Config_getBool
(
"INCLUDED_BY_GRAPH"
))
{
{
//printf("Graph for file %s\n",name().data());
//printf("Graph for file %s\n",name().data());
DotInclDepGraph
incDepGraph
(
this
,
TRUE
);
DotInclDepGraph
incDepGraph
(
this
,
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
),
TRUE
);
if
(
!
incDepGraph
.
isTrivial
())
if
(
!
incDepGraph
.
isTrivial
())
{
{
ol
.
disable
(
OutputGenerator
::
Man
);
ol
.
disable
(
OutputGenerator
::
Man
);
...
...
src/htmldocvisitor.cpp
View file @
7e0aeda8
...
@@ -244,7 +244,10 @@ void HtmlDocVisitor::visit(DocIncOperator *op)
...
@@ -244,7 +244,10 @@ void HtmlDocVisitor::visit(DocIncOperator *op)
}
}
if
(
op
->
type
()
!=
DocIncOperator
::
Skip
)
if
(
op
->
type
()
!=
DocIncOperator
::
Skip
)
{
{
popEnabled
();
if
(
!
m_hide
)
parseCode
(
m_ci
,
op
->
context
(),
op
->
text
().
latin1
(),
op
->
isExample
(),
op
->
exampleFile
());
if
(
!
m_hide
)
parseCode
(
m_ci
,
op
->
context
(),
op
->
text
().
latin1
(),
op
->
isExample
(),
op
->
exampleFile
());
pushEnabled
();
m_hide
=
TRUE
;
}
}
if
(
op
->
isLast
())
if
(
op
->
isLast
())
{
{
...
...
src/memberdef.cpp
View file @
7e0aeda8
...
@@ -737,6 +737,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
...
@@ -737,6 +737,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
ol
.
pushGeneratorState
();
ol
.
pushGeneratorState
();
ol
.
disable
(
OutputGenerator
::
Man
);
ol
.
disable
(
OutputGenerator
::
Man
);
ol
.
disable
(
OutputGenerator
::
Latex
);
ol
.
docify
(
"
\n
"
);
ol
.
docify
(
"
\n
"
);
ol
.
popGeneratorState
();
ol
.
popGeneratorState
();
}
}
...
...
src/translator_pl.h
View file @
7e0aeda8
...
@@ -1176,27 +1176,27 @@ class TranslatorPolish : public Translator
...
@@ -1176,27 +1176,27 @@ class TranslatorPolish : public Translator
/*! Title of the package index page */
/*! Title of the package index page */
virtual
QCString
trPackageList
()
virtual
QCString
trPackageList
()
{
{
return
"Lista Pakietów
"
;
return
decode
(
"Lista Pakietów"
);
}
}
/*! The description of the package index page */
/*! The description of the package index page */
virtual
QCString
trPackageListDescription
()
virtual
QCString
trPackageListDescription
()
{
{
return
"Oto lista pakietów wraz z krótkim opisem (o ile jest dostêpny
):"
;
return
decode
(
"Oto lista pakietów wraz z krótkim opisem (o ile jest dostêpny)
:"
);
}
}
/*! The link name in the Quick links header for each page */
/*! The link name in the Quick links header for each page */
virtual
QCString
trPackages
()
virtual
QCString
trPackages
()
{
{
return
"Pakiety"
;
return
decode
(
"Pakiety"
)
;
}
}
/*! Used as a chapter title for Latex & RTF output */
/*! Used as a chapter title for Latex & RTF output */
virtual
QCString
trPackageDocumentation
()
virtual
QCString
trPackageDocumentation
()
{
{
return
"Dokumentacja Pakietu"
;
return
decode
(
"Dokumentacja Pakietu"
)
;
}
}
/*! Text shown before a multi-line define */
/*! Text shown before a multi-line define */
virtual
QCString
trDefineValue
()
virtual
QCString
trDefineValue
()
{
{
return
"Warto¶æ
:"
;
return
decode
(
"Warto¶æ:
"
);
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
...
@@ -1206,12 +1206,12 @@ class TranslatorPolish : public Translator
...
@@ -1206,12 +1206,12 @@ class TranslatorPolish : public Translator
/*! 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
"B³±
d"
;
return
decode
(
"B³±d
"
);
}
}
/*! Used as the header of the bug list */
/*! Used as the header of the bug list */
virtual
QCString
trBugList
()
virtual
QCString
trBugList
()
{
{
return
"Lista b³êd
ów"
;
return
decode
(
"Lista b³êdó
w"
);
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
...
@@ -1233,7 +1233,7 @@ class TranslatorPolish : public Translator
...
@@ -1233,7 +1233,7 @@ class TranslatorPolish : public Translator
/*! Used as header RTF general index */
/*! Used as header RTF general index */
virtual
QCString
trRTFGeneralIndex
()
virtual
QCString
trRTFGeneralIndex
()
{
{
return
"Indeks"
;
return
decode
(
"Indeks"
)
;
}
}
/*! This is used for translation of the word that will possibly
/*! This is used for translation of the word that will possibly
...
@@ -1267,7 +1267,7 @@ class TranslatorPolish : public Translator
...
@@ -1267,7 +1267,7 @@ class TranslatorPolish : public Translator
QCString
result
((
first_capital
?
"Przestrze"
:
"przestrze"
));
QCString
result
((
first_capital
?
"Przestrze"
:
"przestrze"
));
result
+=
(
singular
?
"ñ"
:
"nie"
);
result
+=
(
singular
?
"ñ"
:
"nie"
);
result
+=
" nazw"
;
result
+=
" nazw"
;
return
result
;
return
decode
(
result
)
;
}
}
/*! This is used for translation of the word that will possibly
/*! This is used for translation of the word that will possibly
...
@@ -1287,7 +1287,7 @@ class TranslatorPolish : public Translator
...
@@ -1287,7 +1287,7 @@ class TranslatorPolish : public Translator
*/
*/
virtual
QCString
trPage
(
bool
first_capital
,
bool
singular
)
virtual
QCString
trPage
(
bool
first_capital
,
bool
singular
)
{
{
QCString
result
((
first_capital
?
"Ston"
:
"stron"
));
QCString
result
((
first_capital
?
"St
r
on"
:
"stron"
));
result
+=
(
singular
?
"a"
:
"y"
);
result
+=
(
singular
?
"a"
:
"y"
);
return
result
;
return
result
;
}
}
...
@@ -1300,7 +1300,7 @@ class TranslatorPolish : public Translator
...
@@ -1300,7 +1300,7 @@ class TranslatorPolish : public Translator
{
{
QCString
result
((
first_capital
?
"Sk³adow"
:
"sk³adow"
));
QCString
result
((
first_capital
?
"Sk³adow"
:
"sk³adow"
));
result
+=
(
singular
?
"a"
:
"e"
);
result
+=
(
singular
?
"a"
:
"e"
);
return
result
;
return
decode
(
result
)
;
}
}
/*! This is used for translation of the word that will possibly
/*! This is used for translation of the word that will possibly
...
@@ -1346,7 +1346,7 @@ class TranslatorPolish : public Translator
...
@@ -1346,7 +1346,7 @@ class TranslatorPolish : public Translator
*/
*/
virtual
QCString
trReferences
()
virtual
QCString
trReferences
()
{
{
return
"Odwo³uje siê d
o"
;
return
decode
(
"Odwo³uje siê do
"
);
}
}
...
@@ -1374,7 +1374,7 @@ class TranslatorPolish : public Translator
...
@@ -1374,7 +1374,7 @@ class TranslatorPolish : public Translator
*/
*/
virtual
QCString
trRTFTableOfContents
()
virtual
QCString
trRTFTableOfContents
()
{
{
return
"Spis tre¶ci
"
;
return
decode
(
"Spis tre¶ci"
);
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
...
@@ -1386,7 +1386,7 @@ class TranslatorPolish : public Translator
...
@@ -1386,7 +1386,7 @@ class TranslatorPolish : public Translator
*/
*/
virtual
QCString
trDeprecatedList
()
virtual
QCString
trDeprecatedList
()
{
{
return
"Lista elementów do wycofania
"
;
return
decode
(
"Lista elementów do wycofania"
);
}
}
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
...
@@ -1403,7 +1403,7 @@ class TranslatorPolish : public Translator
...
@@ -1403,7 +1403,7 @@ class TranslatorPolish : public Translator
/*! Header used for the documentation section of a class' events. */
/*! Header used for the documentation section of a class' events. */
virtual
QCString
trEventDocumentation
()
virtual
QCString
trEventDocumentation
()
{
{
return
"Dokumentacja zdarzeñ
"
;
return
decode
(
"Dokumentacja zdarzeñ"
);
}
}
...
...
src/util.cpp
View file @
7e0aeda8
...
@@ -1932,7 +1932,14 @@ void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl)
...
@@ -1932,7 +1932,14 @@ void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl)
}
}
else
if
(
!
srcA
->
name
.
isEmpty
()
&&
!
dstA
->
name
.
isEmpty
())
else
if
(
!
srcA
->
name
.
isEmpty
()
&&
!
dstA
->
name
.
isEmpty
())
{
{
srcA
->
name
=
dstA
->
name
.
copy
();
if
(
srcA
->
docs
.
isEmpty
()
&&
!
dstA
->
docs
.
isEmpty
())
{
srcA
->
name
=
dstA
->
name
.
copy
();
}
else
if
(
!
srcA
->
docs
.
isEmpty
()
&&
dstA
->
docs
.
isEmpty
())
{
dstA
->
name
=
srcA
->
name
.
copy
();
}
}
}
}
}
else
else
...
...
src/util.h
View file @
7e0aeda8
...
@@ -18,12 +18,15 @@
...
@@ -18,12 +18,15 @@
#ifndef UTIL_H
#ifndef UTIL_H
#define UTIL_H
#define UTIL_H
/*! \file util.h
* \brief A bunch of utility functions.
*/
#include "qtbc.h"
#include "qtbc.h"
#include <qlist.h>
#include <qlist.h>
#include <qtextstream.h>
#include <qtextstream.h>
#include <ctype.h>
#include <ctype.h>
class
ClassDef
;
class
ClassDef
;
class
FileDef
;
class
FileDef
;
class
MemberList
;
class
MemberList
;
...
@@ -73,13 +76,12 @@ class TextGeneratorOLImpl : public TextGeneratorIntf
...
@@ -73,13 +76,12 @@ class TextGeneratorOLImpl : public TextGeneratorIntf
//--------------------------------------------------------------------
//--------------------------------------------------------------------
extern
void
linkifyText
(
const
TextGeneratorIntf
&
ol
,
const
char
*
clName
,
const
char
*
name
,
void
linkifyText
(
const
TextGeneratorIntf
&
ol
,
const
char
*
clName
,
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
);
extern
void
setAnchors
(
ClassDef
*
cd
,
char
id
,
MemberList
*
ml
,
int
groupId
=-
1
);
QCString
fileToString
(
const
char
*
name
,
bool
filter
=
FALSE
);
extern
QCString
fileToString
(
const
char
*
name
,
bool
filter
=
FALSE
);
QCString
dateToString
(
bool
);
extern
QCString
dateToString
(
bool
);
bool
getDefs
(
const
QCString
&
scopeName
,
extern
bool
getDefs
(
const
QCString
&
scopeName
,
const
QCString
&
memberName
,
const
QCString
&
memberName
,
const
char
*
,
const
char
*
,
MemberDef
*&
md
,
MemberDef
*&
md
,
...
@@ -93,14 +95,14 @@ extern bool getDefs(const QCString &scopeName,
...
@@ -93,14 +95,14 @@ extern bool getDefs(const QCString &scopeName,
);
);
extern
bool
resolveRef
(
/* in */
const
char
*
scName
,
bool
resolveRef
(
/* in */
const
char
*
scName
,
/* in */
const
char
*
name
,
/* in */
const
char
*
name
,
/* in */
bool
inSeeBlock
,
/* in */
bool
inSeeBlock
,
/* out */
Definition
**
resContext
,
/* out */
Definition
**
resContext
,
/* out */
MemberDef
**
resMember
/* out */
MemberDef
**
resMember
);
);
extern
bool
resolveLink
(
/* in */
const
char
*
scName
,
bool
resolveLink
(
/* in */
const
char
*
scName
,
/* in */
const
char
*
lr
,
/* in */
const
char
*
lr
,
/* in */
bool
inSeeBlock
,
/* in */
bool
inSeeBlock
,
/* out */
Definition
**
resContext
,
/* out */
Definition
**
resContext
,
...
@@ -108,47 +110,39 @@ extern bool resolveLink(/* in */ const char *scName,
...
@@ -108,47 +110,39 @@ extern bool resolveLink(/* in */ const char *scName,
/* out */
QCString
&
resAnchor
/* out */
QCString
&
resAnchor
);
);
extern
bool
generateRef
(
OutputDocInterface
&
od
,
const
char
*
,
bool
generateRef
(
OutputDocInterface
&
od
,
const
char
*
,
const
char
*
,
bool
inSeeBlock
,
const
char
*
=
0
);
const
char
*
,
bool
inSeeBlock
,
const
char
*
=
0
);
extern
bool
generateLink
(
OutputDocInterface
&
od
,
const
char
*
,
bool
generateLink
(
OutputDocInterface
&
od
,
const
char
*
,
const
char
*
,
bool
inSeeBlock
,
const
char
*
);
const
char
*
,
bool
inSeeBlock
,
const
char
*
);
extern
void
generateFileRef
(
OutputDocInterface
&
od
,
const
char
*
,
void
generateFileRef
(
OutputDocInterface
&
od
,
const
char
*
,
const
char
*
linkTxt
=
0
);
const
char
*
linkTxt
=
0
);
void
writePageRef
(
OutputDocInterface
&
od
,
const
char
*
cn
,
const
char
*
mn
);
void
writePageRef
(
OutputDocInterface
&
od
,
const
char
*
cn
,
const
char
*
mn
);
extern
bool
matchArguments
(
ArgumentList
*
,
ArgumentList
*
,
bool
matchArguments
(
ArgumentList
*
,
ArgumentList
*
,
const
char
*
cl
=
0
,
const
char
*
ns
=
0
,
bool
checkCV
=
TRUE
,
const
char
*
cl
=
0
,
const
char
*
ns
=
0
,
bool
checkCV
=
TRUE
,
NamespaceList
*
usingNamespaces
=
0
,
NamespaceList
*
usingNamespaces
=
0
,
ClassList
*
usingClasses
=
0
);
ClassList
*
usingClasses
=
0
);
extern
void
mergeArguments
(
ArgumentList
*
,
ArgumentList
*
);
void
mergeArguments
(
ArgumentList
*
,
ArgumentList
*
);
extern
QCString
substituteClassNames
(
const
QCString
&
s
);
QCString
substituteClassNames
(
const
QCString
&
s
);
extern
QCString
substitute
(
const
char
*
s
,
const
char
*
src
,
const
char
*
dst
);
QCString
substitute
(
const
char
*
s
,
const
char
*
src
,
const
char
*
dst
);
extern
QCString
resolveDefines
(
const
char
*
n
);
QCString
resolveDefines
(
const
char
*
n
);
extern
ClassDef
*
getClass
(
const
char
*
key
);
ClassDef
*
getClass
(
const
char
*
key
);
extern
ClassDef
*
getResolvedClass
(
Definition
*
scope
,
ClassDef
*
getResolvedClass
(
Definition
*
scope
,
const
char
*
key
,
const
char
*
key
,
bool
*
pIsTypeDef
=
0
,
bool
*
pIsTypeDef
=
0
,
QCString
*
pTemplSpec
=
0
);
QCString
*
pTemplSpec
=
0
);
extern
NamespaceDef
*
getResolvedNamespace
(
const
char
*
key
);
NamespaceDef
*
getResolvedNamespace
(
const
char
*
key
);
extern
FileDef
*
findFileDef
(
const
FileNameDict
*
fnDict
,
const
char
*
n
,
FileDef
*
findFileDef
(
const
FileNameDict
*
fnDict
,
const
char
*
n
,
bool
&
ambig
);
bool
&
ambig
);
extern
QCString
showFileDefMatches
(
const
FileNameDict
*
fnDict
,
const
char
*
n
);
QCString
showFileDefMatches
(
const
FileNameDict
*
fnDict
,
const
char
*
n
);
extern
int
guessSection
(
const
char
*
name
);
int
guessSection
(
const
char
*
name
);
extern
bool
isId
(
char
c
);
bool
isId
(
char
c
);
extern
QCString
removeRedundantWhiteSpace
(
const
QCString
&
s
);
QCString
removeRedundantWhiteSpace
(
const
QCString
&
s
);
//extern void startTitle(OutputList &ol,const char *fileName);
//extern void endTitle(OutputList &ol,const char *fileName,const char *name);
//void startFile(OutputList &ol,const char *name,
// const char *title,bool external=FALSE);
//void endFile(OutputList &ol,bool external=FALSE);
//void writeQuickLinks(OutputList &ol,bool compact,bool external=FALSE);
QCString
argListToString
(
ArgumentList
*
al
);
QCString
argListToString
(
ArgumentList
*
al
);
QCString
tempArgListToString
(
ArgumentList
*
al
);
QCString
tempArgListToString
(
ArgumentList
*
al
);
QCString
generateMarker
(
int
id
);
QCString
generateMarker
(
int
id
);
void
writeExample
(
OutputList
&
ol
,
ExampleSDict
*
el
);
void
writeExample
(
OutputList
&
ol
,
ExampleSDict
*
el
);
//void setFileNameForSections(QList<QCString> *anchorList,const char *fileName,
// PageInfo *pi=0);
QCString
stripAnonymousNamespaceScope
(
const
QCString
&
s
);
QCString
stripAnonymousNamespaceScope
(
const
QCString
&
s
);
QCString
stripFromPath
(
const
QCString
&
path
);
QCString
stripFromPath
(
const
QCString
&
path
);
bool
rightScopeMatch
(
const
QCString
&
scope
,
const
QCString
&
name
);
bool
rightScopeMatch
(
const
QCString
&
scope
,
const
QCString
&
name
);
...
...
src/xmlgen.cpp
View file @
7e0aeda8
...
@@ -979,7 +979,7 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &ti)
...
@@ -979,7 +979,7 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &ti)
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
,
DotClassGraph
::
Inheritance
,
DotClassGraph
inheritanceGraph
(
cd
,
DotClassGraph
::
Inheritance
,
Config_get
Bool
(
"MAX_DOT_GRAPH_DEPTH"
));
Config_get
Int
(
"MAX_DOT_GRAPH_DEPTH"
));
if
(
!
inheritanceGraph
.
isTrivial
())
if
(
!
inheritanceGraph
.
isTrivial
())
{
{
t
<<
" <inheritancegraph>"
<<
endl
;
t
<<
" <inheritancegraph>"
<<
endl
;
...
@@ -987,7 +987,7 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &ti)
...
@@ -987,7 +987,7 @@ static void generateXMLForClass(ClassDef *cd,QTextStream &ti)
t
<<
" </inheritancegraph>"
<<
endl
;
t
<<
" </inheritancegraph>"
<<
endl
;
}
}
DotClassGraph
collaborationGraph
(
cd
,
DotClassGraph
::
Implementation
,
DotClassGraph
collaborationGraph
(
cd
,
DotClassGraph
::
Implementation
,
Config_get
Bool
(
"MAX_DOT_GRAPH_DEPTH"
));
Config_get
Int
(
"MAX_DOT_GRAPH_DEPTH"
));
if
(
!
collaborationGraph
.
isTrivial
())
if
(
!
collaborationGraph
.
isTrivial
())
{
{
t
<<
" <collaborationgraph>"
<<
endl
;
t
<<
" <collaborationgraph>"
<<
endl
;
...
@@ -1162,7 +1162,7 @@ static void generateXMLForFile(FileDef *fd,QTextStream &ti)
...
@@ -1162,7 +1162,7 @@ static void generateXMLForFile(FileDef *fd,QTextStream &ti)
t
<<
"</includedby>"
<<
endl
;
t
<<
"</includedby>"
<<
endl
;
}
}
DotInclDepGraph
incDepGraph
(
fd
,
FALSE
);
DotInclDepGraph
incDepGraph
(
fd
,
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
),
FALSE
);
if
(
!
incDepGraph
.
isTrivial
())
if
(
!
incDepGraph
.
isTrivial
())
{
{
t
<<
" <incdepgraph>"
<<
endl
;
t
<<
" <incdepgraph>"
<<
endl
;
...
@@ -1170,7 +1170,7 @@ static void generateXMLForFile(FileDef *fd,QTextStream &ti)
...
@@ -1170,7 +1170,7 @@ static void generateXMLForFile(FileDef *fd,QTextStream &ti)
t
<<
" </incdepgraph>"
<<
endl
;
t
<<
" </incdepgraph>"
<<
endl
;
}
}
DotInclDepGraph
invIncDepGraph
(
fd
,
TRUE
);
DotInclDepGraph
invIncDepGraph
(
fd
,
Config_getInt
(
"MAX_DOT_GRAPH_DEPTH"
),
TRUE
);
if
(
!
invIncDepGraph
.
isTrivial
())
if
(
!
invIncDepGraph
.
isTrivial
())
{
{
t
<<
" <invincdepgraph>"
<<
endl
;
t
<<
" <invincdepgraph>"
<<
endl
;
...
...
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