Commit 143b39e7 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.4.4-20050817

parent 360bc253
DOXYGEN Version 1.4.4-20050815 DOXYGEN Version 1.4.4-20050817
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 (15 August 2005) Dimitri van Heesch (17 August 2005)
DOXYGEN Version 1.4.4_20050815 DOXYGEN Version 1.4.4_20050817
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -17,5 +17,4 @@ to subscribe to the lists or to visit the archives. ...@@ -17,5 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy, Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (15 August 2005) Dimitri van Heesch (dimitri@stack.nl) (17 August 2005)
1.4.4-20050815 1.4.4-20050817
This diff is collapsed.
BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV {
font-family: Geneva, Arial, Helvetica, sans-serif;
}
BODY,TD {
font-size: 90%;
}
H1 {
text-align: center;
font-size: 160%;
}
H2 {
font-size: 120%;
}
H3 {
font-size: 100%;
}
CAPTION { font-weight: bold }
DIV.qindex {
width: 100%;
background-color: #e8eef2;
border: 1px solid #84b0c7;
text-align: center;
margin: 2px;
padding: 2px;
line-height: 140%;
}
DIV.nav {
width: 100%;
background-color: #e8eef2;
border: 1px solid #84b0c7;
text-align: center;
margin: 2px;
padding: 2px;
line-height: 140%;
}
DIV.navtab {
background-color: #e8eef2;
border: 1px solid #84b0c7;
text-align: center;
margin: 2px;
margin-right: 15px;
padding: 2px;
}
TD.navtab {
font-size: 70%;
}
A.qindex {
text-decoration: none;
font-weight: bold;
color: #1A419D;
}
A.qindex:visited {
text-decoration: none;
font-weight: bold;
color: #1A419D
}
A.qindex:hover {
text-decoration: none;
background-color: #ddddff;
}
A.qindexHL {
text-decoration: none;
font-weight: bold;
background-color: #6666cc;
color: #ffffff;
border: 1px double #9295C2;
}
A.qindexHL:hover {
text-decoration: none;
background-color: #6666cc;
color: #ffffff;
}
A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff }
A.el { text-decoration: none; font-weight: bold }
A.elRef { font-weight: bold }
A.code:link { text-decoration: none; font-weight: normal; color: #0000FF}
A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF}
A.codeRef:link { font-weight: normal; color: #0000FF}
A.codeRef:visited { font-weight: normal; color: #0000FF}
A:hover { text-decoration: none; background-color: #f2f2ff }
DL.el { margin-left: -1cm }
.fragment {
font-family: Fixed, monospace;
font-size: 95%;
}
PRE.fragment {
border: 1px solid #CCCCCC;
background-color: #f5f5f5;
margin-top: 4px;
margin-bottom: 4px;
margin-left: 2px;
margin-right: 8px;
padding-left: 6px;
padding-right: 6px;
padding-top: 4px;
padding-bottom: 4px;
}
DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }
TD.md { background-color: #F4F4FB; font-weight: bold; }
TD.mdPrefix {
background-color: #F4F4FB;
color: #606060;
font-size: 80%;
}
TD.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; }
TD.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; }
DIV.groupHeader {
margin-left: 16px;
margin-top: 12px;
margin-bottom: 6px;
font-weight: bold;
}
DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% }
BODY {
background: white;
color: black;
margin-right: 20px;
margin-left: 20px;
}
TD.indexkey {
background-color: #e8eef2;
font-weight: bold;
padding-right : 10px;
padding-top : 2px;
padding-left : 10px;
padding-bottom : 2px;
margin-left : 0px;
margin-right : 0px;
margin-top : 2px;
margin-bottom : 2px;
border: 1px solid #CCCCCC;
}
TD.indexvalue {
background-color: #e8eef2;
font-style: italic;
padding-right : 10px;
padding-top : 2px;
padding-left : 10px;
padding-bottom : 2px;
margin-left : 0px;
margin-right : 0px;
margin-top : 2px;
margin-bottom : 2px;
border: 1px solid #CCCCCC;
}
TR.memlist {
background-color: #f0f0f0;
}
P.formulaDsp { text-align: center; }
IMG.formulaDsp { }
IMG.formulaInl { vertical-align: middle; }
SPAN.keyword { color: #008000 }
SPAN.keywordtype { color: #604020 }
SPAN.keywordflow { color: #e08000 }
SPAN.comment { color: #800000 }
SPAN.preprocessor { color: #806020 }
SPAN.stringliteral { color: #002080 }
SPAN.charliteral { color: #008080 }
.mdTable {
border: 1px solid #868686;
background-color: #F4F4FB;
}
.mdRow {
padding: 8px 10px;
}
.mdescLeft {
padding: 0px 8px 4px 8px;
font-size: 80%;
font-style: italic;
background-color: #FAFAFA;
border-top: 1px none #E0E0E0;
border-right: 1px none #E0E0E0;
border-bottom: 1px none #E0E0E0;
border-left: 1px none #E0E0E0;
margin: 0px;
}
.mdescRight {
padding: 0px 8px 4px 8px;
font-size: 80%;
font-style: italic;
background-color: #FAFAFA;
border-top: 1px none #E0E0E0;
border-right: 1px none #E0E0E0;
border-bottom: 1px none #E0E0E0;
border-left: 1px none #E0E0E0;
margin: 0px;
}
.memItemLeft {
padding: 1px 0px 0px 8px;
margin: 4px;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
border-top-color: #E0E0E0;
border-right-color: #E0E0E0;
border-bottom-color: #E0E0E0;
border-left-color: #E0E0E0;
border-top-style: solid;
border-right-style: none;
border-bottom-style: none;
border-left-style: none;
background-color: #FAFAFA;
font-size: 80%;
}
.memItemRight {
padding: 1px 8px 0px 8px;
margin: 4px;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
border-top-color: #E0E0E0;
border-right-color: #E0E0E0;
border-bottom-color: #E0E0E0;
border-left-color: #E0E0E0;
border-top-style: solid;
border-right-style: none;
border-bottom-style: none;
border-left-style: none;
background-color: #FAFAFA;
font-size: 80%;
}
.memTemplItemLeft {
padding: 1px 0px 0px 8px;
margin: 4px;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
border-top-color: #E0E0E0;
border-right-color: #E0E0E0;
border-bottom-color: #E0E0E0;
border-left-color: #E0E0E0;
border-top-style: none;
border-right-style: none;
border-bottom-style: none;
border-left-style: none;
background-color: #FAFAFA;
font-size: 80%;
}
.memTemplItemRight {
padding: 1px 8px 0px 8px;
margin: 4px;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
border-top-color: #E0E0E0;
border-right-color: #E0E0E0;
border-bottom-color: #E0E0E0;
border-left-color: #E0E0E0;
border-top-style: none;
border-right-style: none;
border-bottom-style: none;
border-left-style: none;
background-color: #FAFAFA;
font-size: 80%;
}
.memTemplParams {
padding: 1px 0px 0px 8px;
margin: 4px;
border-top-width: 1px;
border-right-width: 1px;
border-bottom-width: 1px;
border-left-width: 1px;
border-top-color: #E0E0E0;
border-right-color: #E0E0E0;
border-bottom-color: #E0E0E0;
border-left-color: #E0E0E0;
border-top-style: solid;
border-right-style: none;
border-bottom-style: none;
border-left-style: none;
color: #606060;
background-color: #FAFAFA;
font-size: 80%;
}
.search { color: #003399;
font-weight: bold;
}
FORM.search {
margin-bottom: 0px;
margin-top: 0px;
}
INPUT.search { font-size: 75%;
color: #000080;
font-weight: normal;
background-color: #e8eef2;
}
TD.tiny { font-size: 75%;
}
a {
color: #1A41A8;
}
a:visited {
color: #2A3798;
}
.dirtab { padding: 4px;
border-collapse: collapse;
border: 1px solid #84b0c7;
}
TH.dirtab { background: #e8eef2;
font-weight: bold;
}
HR { height: 1px;
border: none;
border-top: 1px solid black;
}
"BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV {\n"
" font-family: Geneva, Arial, Helvetica, sans-serif;\n"
"}\n"
"BODY,TD {\n"
" font-size: 90%;\n"
"}\n"
"H1 {\n"
" text-align: center;\n"
" font-size: 160%;\n"
"}\n"
"H2 {\n"
" font-size: 120%;\n"
"}\n"
"H3 {\n"
" font-size: 100%;\n"
"}\n"
"CAPTION { font-weight: bold }\n"
"DIV.qindex {\n"
" width: 100%;\n"
" background-color: #e8eef2;\n"
" border: 1px solid #84b0c7;\n"
" text-align: center;\n"
" margin: 2px;\n"
" padding: 2px;\n"
" line-height: 140%;\n"
"}\n"
"DIV.nav {\n"
" width: 100%;\n"
" background-color: #e8eef2;\n"
" border: 1px solid #84b0c7;\n"
" text-align: center;\n"
" margin: 2px;\n"
" padding: 2px;\n"
" line-height: 140%;\n"
"}\n"
"DIV.navtab {\n"
" background-color: #e8eef2;\n"
" border: 1px solid #84b0c7;\n"
" text-align: center;\n"
" margin: 2px;\n"
" margin-right: 15px;\n"
" padding: 2px;\n"
"}\n"
"TD.navtab {\n"
" font-size: 70%;\n"
"}\n"
"A.qindex {\n"
" text-decoration: none;\n"
" font-weight: bold;\n"
" color: #1A419D;\n"
"}\n"
"A.qindex:visited {\n"
" text-decoration: none;\n"
" font-weight: bold;\n"
" color: #1A419D\n"
"}\n"
"A.qindex:hover {\n"
" text-decoration: none;\n"
" background-color: #ddddff;\n"
"}\n"
"A.qindexHL {\n"
" text-decoration: none;\n"
" font-weight: bold;\n"
" background-color: #6666cc;\n"
" color: #ffffff;\n"
" border: 1px double #9295C2;\n"
"}\n"
"A.qindexHL:hover {\n"
" text-decoration: none;\n"
" background-color: #6666cc;\n"
" color: #ffffff;\n"
"}\n"
"A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff }\n"
"A.el { text-decoration: none; font-weight: bold }\n"
"A.elRef { font-weight: bold }\n"
"A.code:link { text-decoration: none; font-weight: normal; color: #0000FF}\n"
"A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF}\n"
"A.codeRef:link { font-weight: normal; color: #0000FF}\n"
"A.codeRef:visited { font-weight: normal; color: #0000FF}\n"
"A:hover { text-decoration: none; background-color: #f2f2ff }\n"
"DL.el { margin-left: -1cm }\n"
".fragment {\n"
" font-family: Fixed, monospace;\n"
" font-size: 95%;\n"
"}\n"
"PRE.fragment {\n"
" border: 1px solid #CCCCCC;\n"
" background-color: #f5f5f5;\n"
" margin-top: 4px;\n"
" margin-bottom: 4px;\n"
" margin-left: 2px;\n"
" margin-right: 8px;\n"
" padding-left: 6px;\n"
" padding-right: 6px;\n"
" padding-top: 4px;\n"
" padding-bottom: 4px;\n"
"}\n"
"DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }\n"
"TD.md { background-color: #F4F4FB; font-weight: bold; }\n"
"TD.mdPrefix {\n"
" background-color: #F4F4FB;\n"
" color: #606060;\n"
" font-size: 80%;\n"
"}\n"
"TD.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; }\n"
"TD.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; }\n"
"DIV.groupHeader {\n"
" margin-left: 16px;\n"
" margin-top: 12px;\n"
" margin-bottom: 6px;\n"
" font-weight: bold;\n"
"}\n"
"DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% }\n"
"BODY {\n"
" background: white;\n"
" color: black;\n"
" margin-right: 20px;\n"
" margin-left: 20px;\n"
"}\n"
"TD.indexkey {\n"
" background-color: #e8eef2;\n"
" font-weight: bold;\n"
" padding-right : 10px;\n"
" padding-top : 2px;\n"
" padding-left : 10px;\n"
" padding-bottom : 2px;\n"
" margin-left : 0px;\n"
" margin-right : 0px;\n"
" margin-top : 2px;\n"
" margin-bottom : 2px;\n"
" border: 1px solid #CCCCCC;\n"
"}\n"
"TD.indexvalue {\n"
" background-color: #e8eef2;\n"
" font-style: italic;\n"
" padding-right : 10px;\n"
" padding-top : 2px;\n"
" padding-left : 10px;\n"
" padding-bottom : 2px;\n"
" margin-left : 0px;\n"
" margin-right : 0px;\n"
" margin-top : 2px;\n"
" margin-bottom : 2px;\n"
" border: 1px solid #CCCCCC;\n"
"}\n"
"TR.memlist {\n"
" background-color: #f0f0f0; \n"
"}\n"
"P.formulaDsp { text-align: center; }\n"
"IMG.formulaDsp { }\n"
"IMG.formulaInl { vertical-align: middle; }\n"
"SPAN.keyword { color: #008000 }\n"
"SPAN.keywordtype { color: #604020 }\n"
"SPAN.keywordflow { color: #e08000 }\n"
"SPAN.comment { color: #800000 }\n"
"SPAN.preprocessor { color: #806020 }\n"
"SPAN.stringliteral { color: #002080 }\n"
"SPAN.charliteral { color: #008080 }\n"
".mdTable {\n"
" border: 1px solid #868686;\n"
" background-color: #F4F4FB;\n"
"}\n"
".mdRow {\n"
" padding: 8px 10px;\n"
"}\n"
".mdescLeft {\n"
" padding: 0px 8px 4px 8px;\n"
" font-size: 80%;\n"
" font-style: italic;\n"
" background-color: #FAFAFA;\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"
" padding: 0px 8px 4px 8px;\n"
" font-size: 80%;\n"
" font-style: italic;\n"
" background-color: #FAFAFA;\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"
".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-color: #E0E0E0;\n"
" border-right-color: #E0E0E0;\n"
" border-bottom-color: #E0E0E0;\n"
" border-left-color: #E0E0E0;\n"
" border-top-style: solid;\n"
" border-right-style: none;\n"
" border-bottom-style: none;\n"
" border-left-style: none;\n"
" background-color: #FAFAFA;\n"
" font-size: 80%;\n"
"}\n"
".memItemRight {\n"
" padding: 1px 8px 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-color: #E0E0E0;\n"
" border-right-color: #E0E0E0;\n"
" border-bottom-color: #E0E0E0;\n"
" border-left-color: #E0E0E0;\n"
" border-top-style: solid;\n"
" border-right-style: none;\n"
" border-bottom-style: none;\n"
" border-left-style: none;\n"
" background-color: #FAFAFA;\n"
" font-size: 80%;\n"
"}\n"
".memTemplItemLeft {\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-color: #E0E0E0;\n"
" border-right-color: #E0E0E0;\n"
" border-bottom-color: #E0E0E0;\n"
" border-left-color: #E0E0E0;\n"
" border-top-style: none;\n"
" border-right-style: none;\n"
" border-bottom-style: none;\n"
" border-left-style: none;\n"
" background-color: #FAFAFA;\n"
" font-size: 80%;\n"
"}\n"
".memTemplItemRight {\n"
" padding: 1px 8px 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-color: #E0E0E0;\n"
" border-right-color: #E0E0E0;\n"
" border-bottom-color: #E0E0E0;\n"
" border-left-color: #E0E0E0;\n"
" border-top-style: none;\n"
" border-right-style: none;\n"
" border-bottom-style: none;\n"
" border-left-style: none;\n"
" background-color: #FAFAFA;\n"
" font-size: 80%;\n"
"}\n"
".memTemplParams {\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-color: #E0E0E0;\n"
" border-right-color: #E0E0E0;\n"
" border-bottom-color: #E0E0E0;\n"
" border-left-color: #E0E0E0;\n"
" border-top-style: solid;\n"
" border-right-style: none;\n"
" border-bottom-style: none;\n"
" border-left-style: none;\n"
" color: #606060;\n"
" background-color: #FAFAFA;\n"
" font-size: 80%;\n"
"}\n"
".search { color: #003399;\n"
" font-weight: bold;\n"
"}\n"
"FORM.search {\n"
" margin-bottom: 0px;\n"
" margin-top: 0px;\n"
"}\n"
"INPUT.search { font-size: 75%;\n"
" color: #000080;\n"
" font-weight: normal;\n"
" background-color: #e8eef2;\n"
"}\n"
"TD.tiny { font-size: 75%;\n"
"}\n"
"a {\n"
" color: #1A41A8;\n"
"}\n"
"a:visited {\n"
" color: #2A3798;\n"
"}\n"
".dirtab { padding: 4px;\n"
" border-collapse: collapse;\n"
" border: 1px solid #84b0c7;\n"
"}\n"
"TH.dirtab { background: #e8eef2;\n"
" font-weight: bold;\n"
"}\n"
"HR { height: 1px;\n"
" border: none;\n"
" border-top: 1px solid black;\n"
"}\n"
"\n"
...@@ -234,7 +234,7 @@ void FileDef::writeDocumentation(OutputList &ol) ...@@ -234,7 +234,7 @@ void FileDef::writeDocumentation(OutputList &ol)
} }
QCString title = docname+versionTitle; QCString title = docname+versionTitle;
QCString pageTitle=theTranslator->trFileReference(docname); QCString pageTitle=theTranslator->trFileReference(docname);
startFile(ol,getOutputFileBase(),name(),pageTitle); startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_FileVisible);
if (Config_getBool("SHOW_DIRECTORIES") && getDirDef()) if (Config_getBool("SHOW_DIRECTORIES") && getDirDef())
{ {
...@@ -630,7 +630,7 @@ void FileDef::writeSource(OutputList &ol) ...@@ -630,7 +630,7 @@ void FileDef::writeSource(OutputList &ol)
} }
QCString pageTitle = theTranslator->trSourceFile(title); QCString pageTitle = theTranslator->trSourceFile(title);
ol.disableAllBut(OutputGenerator::Html); ol.disableAllBut(OutputGenerator::Html);
startFile(ol,getSourceFileBase(),0,pageTitle); startFile(ol,getSourceFileBase(),0,pageTitle,HLI_FileVisible);
if (Config_getBool("SHOW_DIRECTORIES") && getDirDef()) if (Config_getBool("SHOW_DIRECTORIES") && getDirDef())
{ {
......
...@@ -663,30 +663,6 @@ void FTVHelp::generateTreeView() ...@@ -663,30 +663,6 @@ void FTVHelp::generateTreeView()
t << " <script type=\"text/javascript\">\n"; t << " <script type=\"text/javascript\">\n";
t << " <!-- // Hide script from old browsers\n"; t << " <!-- // Hide script from old browsers\n";
t << " \n"; t << " \n";
//t << " function findChildNode(node, name) \n";
//t << " {\n";
//t << " var temp;\n";
//t << " if (node == null) \n";
//t << " {\n";
//t << " return null;\n";
//t << " } \n";
//t << " node = node.firstChild;\n";
//t << " while (node != null) \n";
//t << " {\n";
//t << " if (node.nodeName == name) \n";
//t << " {\n";
//t << " return node;\n";
//t << " }\n";
//t << " temp = findChildNode(node, name);\n";
//t << " if (temp != null) \n";
//t << " {\n";
//t << " return temp;\n";
//t << " }\n";
//t << " node = node.nextSibling;\n";
//t << " }\n";
//t << " return null;\n";
//t << " }\n";
//t << "\n";
/* User has clicked on a node (folder or +/-) in the tree */ /* User has clicked on a node (folder or +/-) in the tree */
t << " function toggleFolder(id, imageNode) \n"; t << " function toggleFolder(id, imageNode) \n";
...@@ -702,23 +678,12 @@ void FTVHelp::generateTreeView() ...@@ -702,23 +678,12 @@ void FTVHelp::generateTreeView()
t << " imageNode = imageNode.previousSibling;\n"; t << " imageNode = imageNode.previousSibling;\n";
t << " l = imageNode.src.length;\n"; t << " l = imageNode.src.length;\n";
t << " }\n"; t << " }\n";
//t << " var vl = \"" FTV_ICON_FILE(vertline) "\";\n";
//t << " if (imageNode != null && imageNode.nodeName != \"IMG\") \n";
//t << " {\n";
//t << " imageNode = findChildNode(imageNode, \"IMG\");\n";
//t << " if (imageNode!=null) l = imageNode.src.length;\n";
//t << " }\n";
t << " if (folder == null) \n"; t << " if (folder == null) \n";
t << " {\n"; t << " {\n";
t << " } \n"; t << " } \n";
/* Node controls a open section, we need to close it */ /* Node controls a open section, we need to close it */
t << " else if (folder.style.display == \"block\") \n"; t << " else if (folder.style.display == \"block\") \n";
t << " {\n"; t << " {\n";
//t << " while (imageNode != null && \n";
//t << " imageNode.src.substring(l-vl.length,l) == vl)\n";
//t << " {\n";
//t << " imageNode = imageNode.nextSibling;\n";
//t << " }\n";
t << " if (imageNode != null) \n"; t << " if (imageNode != null) \n";
t << " {\n"; t << " {\n";
t << " imageNode.nextSibling.src = \"" FTV_ICON_FILE(folderclosed) "\";\n"; t << " imageNode.nextSibling.src = \"" FTV_ICON_FILE(folderclosed) "\";\n";
...@@ -735,11 +700,6 @@ void FTVHelp::generateTreeView() ...@@ -735,11 +700,6 @@ void FTVHelp::generateTreeView()
t << " } \n"; t << " } \n";
t << " else \n"; /* section is closed, we need to open it */ t << " else \n"; /* section is closed, we need to open it */
t << " {\n"; t << " {\n";
//t << " while (imageNode != null && \n";
//t << " imageNode.src.substring(l-vl.length,l) == vl)\n";
//t << " {\n";
//t << " imageNode = imageNode.nextSibling;\n";
//t << " }\n";
t << " if (imageNode != null) \n"; t << " if (imageNode != null) \n";
t << " {\n"; t << " {\n";
t << " imageNode.nextSibling.src = \"" FTV_ICON_FILE(folderopen) "\";\n"; t << " imageNode.nextSibling.src = \"" FTV_ICON_FILE(folderopen) "\";\n";
......
This diff is collapsed.
This diff is collapsed.
...@@ -90,7 +90,11 @@ enum HighlightedItem ...@@ -90,7 +90,11 @@ enum HighlightedItem
HLI_Globals, HLI_Globals,
HLI_Pages, HLI_Pages,
HLI_Examples, HLI_Examples,
HLI_Search HLI_Search,
HLI_ClassVisible,
HLI_NamespaceVisible,
HLI_FileVisible
}; };
enum ClassMemberHighlight enum ClassMemberHighlight
......
...@@ -40,6 +40,7 @@ HEADERS = bufstr.h \ ...@@ -40,6 +40,7 @@ HEADERS = bufstr.h \
docvisitor.h \ docvisitor.h \
dot.h \ dot.h \
doxygen.h \ doxygen.h \
doxygen_css.h \
entry.h \ entry.h \
example.h \ example.h \
filedef.h \ filedef.h \
......
...@@ -85,12 +85,17 @@ sub GenerateDep { ...@@ -85,12 +85,17 @@ sub GenerateDep {
$(YACC) -l -d -p cppExpYY constexp.y -o ce_parse.c $(YACC) -l -d -p cppExpYY constexp.y -o ce_parse.c
-rm ce_parse.c -rm ce_parse.c
TO_C_CMD=sed -e "s/\\\\/\\\\\\\\/g" -e "s/\"/\\\\\"/g" -e "s/^/\"/g" -e "s/$$/\\\\n\"/g"
index_xsd.h: index.xsd index_xsd.h: index.xsd
cat index.xsd | sed -e "s/\\\\/\\\\\\\\/g" -e "s/\"/\\\\\"/g" -e "s/^/\"/g" -e "s/$$/\\\\n\"/g" >index_xsd.h cat index.xsd | $(TO_C_CMD) >index_xsd.h
compound_xsd.h: compound.xsd compound_xsd.h: compound.xsd
cat compound.xsd | sed -e "s/\\\\/\\\\\\\\/g" -e "s/\"/\\\\\"/g" -e "s/^/\"/g" -e "s/$$/\\\\n\"/g" >compound_xsd.h cat compound.xsd | $(TO_C_CMD) >compound_xsd.h
search_php.h: search.php search_php.h: search.php
cat search.php | sed -e "s/\\\\/\\\\\\\\/g" -e "s/\"/\\\\\"/g" -e "s/^/\"/g" -e "s/$$/\\\\n\"/g" >search_php.h cat search.php | $(TO_C_CMD) >search_php.h
doxygen_css.h: doxygen.css
cat doxygen.css | $(TO_C_CMD) >doxygen_css.h
...@@ -1939,12 +1939,13 @@ void MemberDef::warnIfUndocumented() ...@@ -1939,12 +1939,13 @@ void MemberDef::warnIfUndocumented()
t="group", d=gd; t="group", d=gd;
else else
t="file", d=fd; t="file", d=fd;
static bool extractAll = Config_getBool("EXTRACT_ALL");
//printf("warnIfUndoc: d->isLinkable()=%d isLinkable()=%d " //printf("warnIfUndoc: d->isLinkable()=%d isLinkable()=%d "
// "isDocumentedFriendClass()=%d name()=%s prot=%d\n", // "isDocumentedFriendClass()=%d name()=%s prot=%d\n",
// d->isLinkable(),isLinkable(),isDocumentedFriendClass(), // d->isLinkable(),isLinkable(),isDocumentedFriendClass(),
// name().data(),prot); // name().data(),prot);
if (!isLinkable() && if ((!hasUserDocumentation() && !extractAll) &&
!isFriendClass() && !isFriendClass() &&
name().find('@')==-1 && d->name().find('@')==-1 && name().find('@')==-1 && d->name().find('@')==-1 &&
(prot!=Private || Config_getBool("EXTRACT_PRIVATE")) (prot!=Private || Config_getBool("EXTRACT_PRIVATE"))
......
...@@ -282,7 +282,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol) ...@@ -282,7 +282,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
{ {
pageTitle = theTranslator->trNamespaceReference(displayName()); pageTitle = theTranslator->trNamespaceReference(displayName());
} }
startFile(ol,getOutputFileBase(),name(),pageTitle); startFile(ol,getOutputFileBase(),name(),pageTitle,HLI_NamespaceVisible);
if (getOuterScope()!=Doxygen::globalScope) if (getOuterScope()!=Doxygen::globalScope)
{ {
writeNavigationPath(ol); writeNavigationPath(ol);
......
...@@ -69,7 +69,7 @@ class NamespaceDef : public Definition ...@@ -69,7 +69,7 @@ class NamespaceDef : public Definition
int i = name().findRev("::"); int i = name().findRev("::");
if (i==-1) i=0; else i+=2; if (i==-1) i=0; else i+=2;
return !name().isEmpty() && name().at(i)!='@' && return !name().isEmpty() && name().at(i)!='@' &&
hasDocumentation() && !isReference(); hasDocumentation() && !isReference() && !isHidden();
} }
bool isLinkable() const bool isLinkable() const
{ {
......
...@@ -2242,13 +2242,17 @@ void preprocessFile(const char *fileName,BufStr &output) ...@@ -2242,13 +2242,17 @@ void preprocessFile(const char *fileName,BufStr &output)
if (i<(int)tmp.length()) definition+=tmp.mid(i,tmp.length()-i); if (i<(int)tmp.length()) definition+=tmp.mid(i,tmp.length()-i);
// add define definition to the dictionary of defines for this file // add define definition to the dictionary of defines for this file
Define *def = new Define; QCString dname = ds.left(i_obrace);
def->name = ds.left(i_obrace); if (!dname.isEmpty())
def->definition = definition; {
def->nargs = count; Define *def = new Define;
def->isPredefined = TRUE; def->name = dname;
def->nonRecursive = nonRecursive; def->definition = definition;
g_fileDefineDict->insert(def->name,def); def->nargs = count;
def->isPredefined = TRUE;
def->nonRecursive = nonRecursive;
g_fileDefineDict->insert(def->name,def);
}
//printf("#define `%s' `%s' #nargs=%d\n", //printf("#define `%s' `%s' #nargs=%d\n",
// def->name.data(),def->definition.data(),def->nargs); // def->name.data(),def->definition.data(),def->nargs);
...@@ -2270,10 +2274,17 @@ void preprocessFile(const char *fileName,BufStr &output) ...@@ -2270,10 +2274,17 @@ void preprocessFile(const char *fileName,BufStr &output)
def->name = ds.left(ine); def->name = ds.left(ine);
def->definition = ds.right(ds.length()-i_equals-1); def->definition = ds.right(ds.length()-i_equals-1);
} }
def->nargs = -1; if (!def->name.isEmpty())
def->isPredefined = TRUE; {
def->nonRecursive = nonRecursive; def->nargs = -1;
g_fileDefineDict->insert(def->name,def); def->isPredefined = TRUE;
def->nonRecursive = nonRecursive;
g_fileDefineDict->insert(def->name,def);
}
else
{
delete def;
}
//printf("#define `%s' `%s' #nargs=%d\n", //printf("#define `%s' `%s' #nargs=%d\n",
// def->name.data(),def->definition.data(),def->nargs); // def->name.data(),def->definition.data(),def->nargs);
......
...@@ -15,11 +15,13 @@ ...@@ -15,11 +15,13 @@
* *
*/ */
/* This code is based on the work done by the MoxyPyDoxy team /* This code is based on the work done by the MoxyPyDoxy team
* (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada), executed * (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada)
* as part of CS179e (Compiler design project) at the UC Riverside, * in Spring 2005 as part of CS 179E: Compiler Design Project
* under supervision of Peter H. Fröhlic. * at the University of California, Riverside; the course was
* taught by Peter H. Froehlich <phf@acm.org>.
*/ */
#ifndef PYCODE_H #ifndef PYCODE_H
#define PYCODE_H #define PYCODE_H
......
...@@ -15,11 +15,13 @@ ...@@ -15,11 +15,13 @@
* *
*/ */
/* This code is based on the work done by the MoxyPyDoxy team /* This code is based on the work done by the MoxyPyDoxy team
* (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada), executed * (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada)
* as part of CS179e (Compiler design project) at the UC Riverside, * in Spring 2005 as part of CS 179E: Compiler Design Project
* under supervision of Peter H. Fröhlic * at the University of California, Riverside; the course was
* taught by Peter H. Froehlich <phf@acm.org>.
*/ */
%{ %{
#include <stdio.h> #include <stdio.h>
......
...@@ -15,11 +15,13 @@ ...@@ -15,11 +15,13 @@
* *
*/ */
/* This code is based on the work done by the MoxyPyDoxy team /* This code is based on the work done by the MoxyPyDoxy team
* (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada), executed * (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada)
* as part of CS179e (Compiler design project) at the UC Riverside, * in Spring 2005 as part of CS 179E: Compiler Design Project
* under supervision of Peter H. Fröhlic. * at the University of California, Riverside; the course was
* taught by Peter H. Froehlich <phf@acm.org>.
*/ */
#ifndef PYSCANNER_H #ifndef PYSCANNER_H
#define PYSCANNER_H #define PYSCANNER_H
......
...@@ -15,11 +15,13 @@ ...@@ -15,11 +15,13 @@
* *
*/ */
/* This code is based on the work done by the MoxyPyDoxy team /* This code is based on the work done by the MoxyPyDoxy team
* (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada), executed * (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada)
* as part of CS179e (Compiler design project) at the UC Riverside, * in Spring 2005 as part of CS 179E: Compiler Design Project
* under supervision of Peter H. Fröhlic. * at the University of California, Riverside; the course was
* taught by Peter H. Froehlich <phf@acm.org>.
*/ */
%{ %{
/* /*
...@@ -80,6 +82,7 @@ static QCString docBlockName; ...@@ -80,6 +82,7 @@ static QCString docBlockName;
static bool docBlockInBody; static bool docBlockInBody;
static bool docBlockJavaStyle; static bool docBlockJavaStyle;
static bool docBrief; static bool docBrief;
static bool docBlockSpecial;
static bool g_doubleQuote; static bool g_doubleQuote;
static bool g_specialBlock; static bool g_specialBlock;
...@@ -322,6 +325,7 @@ static void initTriDoubleQuoteBlock() ...@@ -322,6 +325,7 @@ static void initTriDoubleQuoteBlock()
docBlockContext = YY_START; docBlockContext = YY_START;
docBlockInBody = FALSE; docBlockInBody = FALSE;
docBlockJavaStyle = TRUE; docBlockJavaStyle = TRUE;
docBlockSpecial = yytext[3]=='!';
docBlock.resize(0); docBlock.resize(0);
g_doubleQuote = TRUE; g_doubleQuote = TRUE;
startCommentBlock(FALSE); startCommentBlock(FALSE);
...@@ -332,6 +336,7 @@ static void initTriSingleQuoteBlock() ...@@ -332,6 +336,7 @@ static void initTriSingleQuoteBlock()
docBlockContext = YY_START; docBlockContext = YY_START;
docBlockInBody = FALSE; docBlockInBody = FALSE;
docBlockJavaStyle = TRUE; docBlockJavaStyle = TRUE;
docBlockSpecial = yytext[3]=='!';
docBlock.resize(0); docBlock.resize(0);
g_doubleQuote = FALSE; g_doubleQuote = FALSE;
startCommentBlock(FALSE); startCommentBlock(FALSE);
...@@ -390,8 +395,8 @@ PARAMNONEMPTY [^ \t\n():] ...@@ -390,8 +395,8 @@ PARAMNONEMPTY [^ \t\n():]
IDENTIFIER ({LETTER}|"_")({LETTER}|{DIGIT}|"_")* IDENTIFIER ({LETTER}|"_")({LETTER}|{DIGIT}|"_")*
BORDER ([^A-Za-z0-9]) BORDER ([^A-Za-z0-9])
TRISINGLEQUOTE "'''" TRISINGLEQUOTE "'''"(!)?
TRIDOUBLEQUOTE "\"\"\"" TRIDOUBLEQUOTE "\"\"\""(!)?
LONGSTRINGCHAR [^\\"'] LONGSTRINGCHAR [^\\"']
ESCAPESEQ ("\\")(.) ESCAPESEQ ("\\")(.)
LONGSTRINGITEM ({LONGSTRINGCHAR}|{ESCAPESEQ}) LONGSTRINGITEM ({LONGSTRINGCHAR}|{ESCAPESEQ})
...@@ -1049,8 +1054,11 @@ STARTDOCSYMS ^{B}"##"/[^#] ...@@ -1049,8 +1054,11 @@ STARTDOCSYMS ^{B}"##"/[^#]
if (g_specialBlock || g_expectModuleDocs) if (g_specialBlock || g_expectModuleDocs)
{ {
QCString actualDoc=docBlock; QCString actualDoc=docBlock;
actualDoc.prepend("\\verbatim "); if (!docBlockSpecial) // legacy unformatted docstring
actualDoc.append("\\endverbatim "); {
actualDoc.prepend("\\verbatim ");
actualDoc.append("\\endverbatim ");
}
if (g_expectModuleDocs) if (g_expectModuleDocs)
{ {
actualDoc.prepend("\\namespace "+g_moduleScope+"\\_linebr "); actualDoc.prepend("\\namespace "+g_moduleScope+"\\_linebr ");
...@@ -1377,7 +1385,11 @@ static void parsePrototype(const QCString &text) ...@@ -1377,7 +1385,11 @@ static void parsePrototype(const QCString &text)
current->section = Entry::VARIABLEDOC_SEC; current->section = Entry::VARIABLEDOC_SEC;
// restore original scanner state // restore original scanner state
YY_BUFFER_STATE tmpBuf = YY_CURRENT_BUFFER;
yy_switch_to_buffer(orgState); yy_switch_to_buffer(orgState);
yy_delete_buffer(tmpBuf);
inputString = orgInputString; inputString = orgInputString;
inputPosition = orgInputPosition; inputPosition = orgInputPosition;
......
...@@ -2142,6 +2142,10 @@ IDLATTR ("["[^\]]*"]"){BN}* ...@@ -2142,6 +2142,10 @@ IDLATTR ("["[^\]]*"]"){BN}*
{ {
current->type = current->type.mid(3); current->type = current->type.mid(3);
} }
if (isTypedef && current->type.left(8)!="typedef ")
{
current->type.prepend("typedef ");
}
bool needNewCurrent=FALSE; bool needNewCurrent=FALSE;
if (!current->name.isEmpty() && current->section!=Entry::ENUM_SEC) if (!current->name.isEmpty() && current->section!=Entry::ENUM_SEC)
{ {
......
...@@ -288,11 +288,8 @@ function main() ...@@ -288,11 +288,8 @@ function main()
{ {
$query=$_GET["query"]; $query=$_GET["query"];
} }
echo "<input class=\"search\" type=\"text\" name=\"query\" value=\"$query\" size=\"20\" accesskey=\"s\"/>\n"; end_form($query);
echo "</span>\n"; echo "&nbsp;\n<div class=\"searchresults\">\n";
echo "</form>\n";
echo "</div>\n";
echo "<div class=\"searchresults\">\n";
$results = array(); $results = array();
$requiredWords = array(); $requiredWords = array();
$forbiddenWords = array(); $forbiddenWords = array();
......
...@@ -288,11 +288,8 @@ ...@@ -288,11 +288,8 @@
" {\n" " {\n"
" $query=$_GET[\"query\"];\n" " $query=$_GET[\"query\"];\n"
" }\n" " }\n"
" echo \"<input class=\\\"search\\\" type=\\\"text\\\" name=\\\"query\\\" value=\\\"$query\\\" size=\\\"20\\\" accesskey=\\\"s\\\"/>\\n\";\n" " end_form($query);\n"
" echo \"</span>\\n\";\n" " echo \"&nbsp;\\n<div class=\\\"searchresults\\\">\\n\";\n"
" echo \"</form>\\n\";\n"
" echo \"</div>\\n\";\n"
" echo \"<div class=\\\"searchresults\\\">\\n\";\n"
" $results = array();\n" " $results = array();\n"
" $requiredWords = array();\n" " $requiredWords = array();\n"
" $forbiddenWords = array();\n" " $forbiddenWords = array();\n"
......
...@@ -1136,35 +1136,38 @@ ClassDef *getResolvedClassRec(Definition *scope, ...@@ -1136,35 +1136,38 @@ ClassDef *getResolvedClassRec(Definition *scope,
// see if we are dealing with a class or a typedef // see if we are dealing with a class or a typedef
if (d->definitionType()==Definition::TypeClass) // d is a class if (d->definitionType()==Definition::TypeClass) // d is a class
{ {
if (!((ClassDef*)d)->isArtificial()) if (!((ClassDef*)d)->isTemplateArgument()) // skip classes that
// are only there to
// represent a template
// argument
{ {
if (distance<minDistance) // found a definition that is "closer" if (distance<minDistance) // found a definition that is "closer"
{ {
minDistance=distance; minDistance=distance;
bestMatch = (ClassDef *)d; bestMatch = (ClassDef *)d;
bestTypedef = 0; bestTypedef = 0;
bestTemplSpec.resize(0); bestTemplSpec.resize(0);
} }
else if (distance==minDistance && else if (distance==minDistance &&
fileScope && bestMatch && fileScope && bestMatch &&
fileScope->getUsedNamespaces() && fileScope->getUsedNamespaces() &&
d->getOuterScope()->definitionType()==Definition::TypeNamespace && d->getOuterScope()->definitionType()==Definition::TypeNamespace &&
bestMatch->getOuterScope()==Doxygen::globalScope bestMatch->getOuterScope()==Doxygen::globalScope
) )
{ {
// in case the distance is equal it could be that a class X // in case the distance is equal it could be that a class X
// is defined in a namespace and in the global scope. When searched // is defined in a namespace and in the global scope. When searched
// in the global scope the distance is 0 in both cases. We have // in the global scope the distance is 0 in both cases. We have
// to choose one of the definitions: we choose the one in the // to choose one of the definitions: we choose the one in the
// namespace if the fileScope imports namespaces and the definition // namespace if the fileScope imports namespaces and the definition
// found was in a namespace while the best match so far isn't. // found was in a namespace while the best match so far isn't.
// Just a non-perfect heuristic but it could help in some situations // Just a non-perfect heuristic but it could help in some situations
// (kdecore code is an example). // (kdecore code is an example).
minDistance=distance; minDistance=distance;
bestMatch = (ClassDef *)d; bestMatch = (ClassDef *)d;
bestTypedef = 0; bestTypedef = 0;
bestTemplSpec.resize(0); bestTemplSpec.resize(0);
} }
} }
} }
else if (d->definitionType()==Definition::TypeMember) else if (d->definitionType()==Definition::TypeMember)
...@@ -1173,32 +1176,49 @@ ClassDef *getResolvedClassRec(Definition *scope, ...@@ -1173,32 +1176,49 @@ ClassDef *getResolvedClassRec(Definition *scope,
//printf(" member isTypedef()=%d\n",md->isTypedef()); //printf(" member isTypedef()=%d\n",md->isTypedef());
if (md->isTypedef()) // d is a typedef if (md->isTypedef()) // d is a typedef
{ {
//printf(" found typedef!\n"); QCString args=md->argsString();
if (args.isEmpty()) // do not expand "typedef t a[4];"
// we found a symbol at this distance, but if it didn't
// resolve to a class, we still have to make sure that
// something at a greater distance does not match, since
// that symbol is hidden by this one.
if (distance<minDistance)
{ {
QCString spec; //printf(" found typedef!\n");
minDistance=distance;
MemberDef *enumType = 0; // we found a symbol at this distance, but if it didn't
ClassDef *cd = newResolveTypedef(fileScope,md,&enumType,&spec); // resolve to a class, we still have to make sure that
if (cd) // shouldn't be 0, but could in some weird cases // something at a greater distance does not match, since
// that symbol is hidden by this one.
if (distance<minDistance)
{ {
//printf(" bestTypeDef=%p spec=%s\n",md,spec.data()); QCString spec;
bestMatch = cd; minDistance=distance;
bestTypedef = md; MemberDef *enumType = 0;
bestTemplSpec = spec; ClassDef *cd = newResolveTypedef(fileScope,md,&enumType,&spec);
if (cd) // shouldn't be 0, but could in some weird cases
{
//printf(" bestTypeDef=%p spec=%s\n",md,spec.data());
bestMatch = cd;
bestTypedef = md;
bestTemplSpec = spec;
}
else if (enumType)
{
//printf(" is enum\n");
bestMatch = 0;
bestTypedef = enumType;
bestTemplSpec = "";
}
else
{
//printf(" no match\n");
}
} }
else if (enumType) else
{ {
bestMatch = 0; //printf(" not the best match %d min=%d\n",distance,minDistance);
bestTypedef = enumType;
bestTemplSpec = "";
} }
} }
else
{
//printf(" not a simple typedef\n")
}
} }
else if (md->isEnumerate()) else if (md->isEnumerate())
{ {
...@@ -1255,7 +1275,8 @@ ClassDef *getResolvedClass(Definition *scope, ...@@ -1255,7 +1275,8 @@ ClassDef *getResolvedClass(Definition *scope,
const char *n, const char *n,
MemberDef **pTypeDef, MemberDef **pTypeDef,
QCString *pTemplSpec, QCString *pTemplSpec,
bool mayBeUnlinkable bool mayBeUnlinkable,
bool mayBeHidden
) )
{ {
g_resolvedTypedefs.clear(); g_resolvedTypedefs.clear();
...@@ -1276,7 +1297,10 @@ ClassDef *getResolvedClass(Definition *scope, ...@@ -1276,7 +1297,10 @@ ClassDef *getResolvedClass(Definition *scope,
ClassDef *result = getResolvedClassRec(scope,fileScope,n,pTypeDef,pTemplSpec); ClassDef *result = getResolvedClassRec(scope,fileScope,n,pTypeDef,pTemplSpec);
if (!mayBeUnlinkable && result && !result->isLinkable()) if (!mayBeUnlinkable && result && !result->isLinkable())
{ {
result=0; // don't link to artifical/hidden classes if (!mayBeHidden || !result->isHidden())
{
result=0; // don't link to artifical/hidden classes unless explicitly allowed
}
} }
//printf("getResolvedClass(%s,%s)=%s\n",scope?scope->name().data():"<global>", //printf("getResolvedClass(%s,%s)=%s\n",scope?scope->name().data():"<global>",
// n,result?result->name().data():"<none>"); // n,result?result->name().data():"<none>");
......
...@@ -151,7 +151,8 @@ ClassDef *getResolvedClass(Definition *scope, ...@@ -151,7 +151,8 @@ ClassDef *getResolvedClass(Definition *scope,
const char *key, const char *key,
MemberDef **pTypeDef=0, MemberDef **pTypeDef=0,
QCString *pTemplSpec=0, QCString *pTemplSpec=0,
bool mayBeUnlinkable=FALSE); bool mayBeUnlinkable=FALSE,
bool mayBeHidden=FALSE);
NamespaceDef *getResolvedNamespace(const char *key); NamespaceDef *getResolvedNamespace(const char *key);
FileDef *findFileDef(const FileNameDict *fnDict,const char *n, FileDef *findFileDef(const FileNameDict *fnDict,const char *n,
bool &ambig); bool &ambig);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment