Commit 3b8b750f authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.1.2-20000430

parent a790b4ae
DOXYGEN Version 1.1.2-20000423
DOXYGEN Version 1.1.2-20000430
CONTENTS
--------
......@@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
1. Unpack the archive, unless you already have:
gunzip doxygen-1.1.2-20000423.src.tar.gz # uncompress the archive
tar xf doxygen-1.1.2-20000423.src.tar # unpack it
gunzip doxygen-1.1.2-20000430.src.tar.gz # uncompress the archive
tar xf doxygen-1.1.2-20000430.src.tar # unpack it
2. Run the configure script:
......@@ -252,4 +252,4 @@ The latest version of doxygen can be obtained at
Enjoy,
Dimitri van Heesch (23 April 2000)
Dimitri van Heesch (30 April 2000)
DOXYGEN Version 1.1.2-20000423
DOXYGEN Version 1.1.2-20000430
Please read INSTALL for compilation instructions.
......@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
Enjoy,
Dimitri van Heesch (23 April 2000)
Dimitri van Heesch (30 April 2000)
1.1.2-20000423
1.1.2-20000430
......@@ -335,8 +335,17 @@ static void substEnvVarsInStrList(QStrList &sl)
while (s)
{
QCString result(s);
bool wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1);
substEnvVarsInString(result);
if (!wasQuoted) /* as a result of the expansion, a single string
may have expanded into a list, which we'll
add to sl. If the orginal string already
contained multiple elements no splitting is done! */
{
int l=result.length();
int i,p=0;
// skip spaces
......@@ -395,6 +404,11 @@ static void substEnvVarsInStrList(QStrList &sl)
else // just removed last item
s = 0;
}
else // just goto the next element in the list
{
s=sl.next();
}
}
}
......
......@@ -21,9 +21,10 @@
#include <qfile.h>
#include <qlist.h>
#include <qdict.h>
#include <qstringlist.h>
#include <qstrlist.h>
#include <stdio.h>
#include <stdlib.h>
static QString spaces=" ";
......@@ -122,7 +123,9 @@ class ConfigOption
stringToC(t,longDesc," t << \"# ","\\n\";");
t << " t << \"\\n\";" << endl;
t << " }" << endl;
t << " t << \"" << cfgName << " = \";" << endl;
t << " t << \"" << cfgName;
t << spaces.left(22-cfgName.length());
t << "= \";" << endl;
t << " " << writeFunc << "(t,Config::" << varName << ");" << endl;
t << " t << \"\\n\";" << endl;
}
......@@ -406,9 +409,11 @@ class ConfigString : public ConfigOption
<< ",SIGNAL(changed()),this,SIGNAL(changed()));" << endl;
if (m_values.count()>0)
{
for ( QStringList::Iterator it = m_values.begin(); it != m_values.end(); ++it )
char *s = m_values.first();
while (s)
{
t << " " << varName << "->addValue(\"" << (*it) << "\");" << endl;
t << " " << varName << "->addValue(\"" << s << "\");" << endl;
s = m_values.next();
}
}
}
......@@ -434,7 +439,7 @@ class ConfigString : public ConfigOption
private:
ConfigInfo *m_parent;
WidgetType m_widgetType;
QStringList m_values;
QStrList m_values;
};
class ConfigInt : public ConfigOption
......
......@@ -51,7 +51,7 @@ PageWidget::PageWidget( QTabWidget *parent, const char *name )
m_parent->addTab( this, name );
}
void PageWidget::addStretch(int stretch=0)
void PageWidget::addStretch(int stretch)
{
lay->addStretch(stretch);
//printf("Viewport SizeHint %d,%d\n",viewport()->sizeHint().width(),viewport()->sizeHint().height());
......
......@@ -106,6 +106,7 @@ The special HTML characters entities that are recognized by Doxygen:
writes a character with a circumflex accent (like &acirc;).
<li>\c &?tilde; where ? is one of {A,N,O,a,n,o},
writes a character with a tilde accent (like &atilde;).
<li>\c &szlig; write a sharp s (i.e. &szlig;) to the output.
</ul>
*/
......
......@@ -164,6 +164,18 @@ Here is a list of the languages and their current maintainers:
snob@NOSPAM.int.spb.ru</a>
</TD>
</TR>
<TR BGCOLOR="#ffffff">
<TD>
Croatian
</TD>
<TD>
Boris Bralo
</TD>
<TD>
<a href="mailto:boris.bralo@NOSPAM.zg.tel.hr">
boris.bralo@NOSPAM.zg.tel.hr</a>
</TD>
</TR>
<TR BGCOLOR="#ffffff">
<TD>
......@@ -205,9 +217,11 @@ Here is a list of the languages and their current maintainers:
\hline
Spanish & Francisco Oltra Thennet & {\tt foltra@puc.cl} \\
\hline
Finish & Olli Korhonen & {\tt Olli.Korhonen@ccc.fi} \\
Finnish & Olli Korhonen & {\tt Olli.Korhonen@ccc.fi} \\
\hline
Russian & Nickolay Semyonov & {\tt snob@int.spb.ru} \\
\hline
Russian & Vladimir Vodolazkiy & {\tt voldemarus@geocities.com} \\
Croatian & Boris Bralo & {\tt boris.bralo@zg.tel.hr} \\
\hline
Dutch & Dimitri van Heesch & {\tt dimitri@stack.nl} \\
\hline
......
Name: doxygen
Version: 1.1.2-20000423
Version: 1.1.2-20000430
Summary: documentation system for C, C++ and IDL
Release: 1
Source0: doxygen-%{version}.src.tar.gz
......
......@@ -774,9 +774,9 @@ void ClassDef::writeDocumentation(OutputList &ol)
// write detailed description
bool exampleFlag=hasExamples();
if (!briefDescription().isEmpty() ||
if ((!briefDescription().isEmpty() && Config::repeatBriefFlag) ||
!documentation().isEmpty() ||
(startBodyLine!=-1 && bodyDef) ||
/*(Config::sourceBrowseFlag && startBodyLine!=-1 && bodyDef) ||*/
exampleFlag)
{
ol.writeRuler();
......@@ -884,15 +884,15 @@ void ClassDef::writeDocumentation(OutputList &ol)
enumMembers.writeDocumentation(ol,name());
}
enumValMembers.countDocMembers();
if (enumValMembers.totalCount()>0)
{
ol.writeRuler();
ol.startGroupHeader();
parseText(ol,theTranslator->trEnumerationValueDocumentation());
ol.endGroupHeader();
enumValMembers.writeDocumentation(ol,name());
}
//enumValMembers.countDocMembers();
//if (enumValMembers.totalCount()>0)
//{
// ol.writeRuler();
// ol.startGroupHeader();
// parseText(ol,theTranslator->trEnumerationValueDocumentation());
// ol.endGroupHeader();
// enumValMembers.writeDocumentation(ol,name());
//}
constructors.countDocMembers();
if (constructors.totalCount()>0)
......
......@@ -18,6 +18,9 @@
#include "classlist.h"
#include "config.h"
#include "util.h"
#include "outputlist.h"
#include "language.h"
#include "scanner.h"
ClassList::ClassList() : QList<ClassDef>()
{
......@@ -43,3 +46,59 @@ ClassListIterator::ClassListIterator(const ClassList &cllist) :
QListIterator<ClassDef>(cllist)
{
}
void ClassList::writeDeclaration(OutputList &ol)
{
if (count()>0)
{
ClassDef *cd=first();
bool found=FALSE;
while (cd)
{
if (cd->name().find('@')==-1)
{
bool isLink = cd->isLinkable();
if (isLink || !Config::hideClassFlag)
{
if (!found)
{
ol.startMemberHeader();
parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startMemberList();
found=TRUE;
}
ol.startMemberItem(FALSE);
switch (cd->compoundType())
{
case ClassDef::Class: ol.writeString("class"); break;
case ClassDef::Struct: ol.writeString("struct"); break;
case ClassDef::Union: ol.writeString("union"); break;
case ClassDef::Interface: ol.writeString("interface"); break;
case ClassDef::Exception: ol.writeString("exception"); break;
}
ol.writeString(" ");
ol.insertMemberAlign();
if (isLink)
{
ol.writeObjectLink(cd->getReference(),
cd->getOutputFileBase(),
0,
cd->name()
);
}
else
{
ol.startBold();
ol.docify(cd->name());
ol.endBold();
}
ol.endMemberItem(FALSE);
}
}
cd=next();
}
if (found) ol.endMemberList();
}
}
......@@ -30,6 +30,7 @@ class ClassList : public QList<ClassDef>
~ClassList();
int compareItems(GCI item1,GCI item2);
void writeDeclaration(OutputList &ol);
};
class ClassListIterator : public QListIterator<ClassDef>
......
......@@ -34,7 +34,6 @@
#include "outputlist.h"
#include "util.h"
#define YY_NO_UNPUT
#define YY_NEVER_INTERACTIVE 1
class CodeClassDef
......@@ -107,12 +106,17 @@ static QCString g_exampleFile;
static int g_anchorCount;
static FileDef * g_sourceFileDef;
static bool g_includeCodeFragment;
static const char * g_currentFontClass;
// start a new line of code, inserting a line number if g_sourceFileDef
// is TRUE. If a definition starts at the current line, then the line
// number is linked to the documentation of that definition.
static void startCodeLine(OutputList &ol)
{
if (g_currentFontClass)
{
g_code->endFontClass();
}
if (g_sourceFileDef)
{
QCString lineNumber,lineAnchor;
......@@ -135,6 +139,10 @@ static void startCodeLine(OutputList &ol)
}
}
ol.startCodeLine();
if (g_currentFontClass)
{
g_code->startFontClass(g_currentFontClass);
}
}
// write a code fragment `text' that may span multiple lines, inserting
......@@ -175,8 +183,7 @@ static void writeMultiLineCodeLink(OutputList &ol,
const char *anchor,const char *text)
{
bool done=FALSE;
QCString ts = text;
char *p=ts.data();
char *p=(char *)text;
while (!done)
{
char *sp=p;
......@@ -226,7 +233,7 @@ static void setClassScope(const QCString &name)
QCString n=name;
n=n.simplifyWhiteSpace();
int index;
if ((index=n.find("::"))!=-1)
if ((index=n.findRev("::"))!=-1)
g_classScope=n.left(index);
else
g_classScope.resize(0);
......@@ -238,12 +245,18 @@ static void addVariable()
g_cvd.name=g_name.copy().simplifyWhiteSpace();
g_cvd.type=g_type.copy().simplifyWhiteSpace();
if (g_type.isEmpty())
{
return;
else if ((getClass(g_cvd.type)) || (g_codeClassDict[g_cvd.type]))
}
else
{
//printf("adding variable `%s' `%s'\n",g_cvd.type.data(),g_cvd.name.data());
if ((getClass(g_cvd.type)) || (g_codeClassDict[g_cvd.type]))
{
g_cvd.classScope=g_classScope;
g_codeVarList.append(new CodeVarDef(g_cvd)); // add it to a list
}
}
}
static void addParameter()
......@@ -251,20 +264,32 @@ static void addParameter()
g_cvd.name=g_parmName.copy().simplifyWhiteSpace();
g_cvd.type=g_parmType.copy().simplifyWhiteSpace();
if (g_cvd.type.isEmpty())
{
return;
else if ((getClass(g_cvd.type)) || (g_codeClassDict[g_cvd.type]))
}
else
{
//printf("adding parameter `%s' `%s'\n",g_cvd.type.data(),g_cvd.name.data());
if ((getClass(g_cvd.type)) || (g_codeClassDict[g_cvd.type]))
{
g_cvd.classScope=g_classScope;
g_codeParmList.append(new CodeVarDef(g_cvd)); // add it to a list
}
}
}
static void generateClassLink(OutputList &ol,char *clName)
static void generateClassLink(OutputList &ol,char *clName,int *clNameLen=0)
{
int i=0;
QCString className=clName;
if (clNameLen) *clNameLen=0;
if (className.isEmpty()) return;
ClassDef *cd;
if ((cd=getClass(className)) && cd->isLinkable())
ClassDef *cd=getClass(className);
if (cd==0 && (i=className.find('<'))!=-1)
{
cd=getClass(className.left(i));
}
if (cd && cd->isLinkable())
{
if (g_exampleBlock)
{
......@@ -285,12 +310,13 @@ static void generateClassLink(OutputList &ol,char *clName)
g_anchorCount++;
}
}
//ol.writeCodeLink(cd->getReference(),cd->getOutputFileBase(),0,className);
writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),0,className);
if (clNameLen) *clNameLen=className.length()-i-1;
}
else
{
codifyLines(clName);
if (clNameLen) *clNameLen=className.length()-1;
}
}
......@@ -330,11 +356,9 @@ static bool getLink(const char *className,
Definition *d=0;
if (cd) d=cd; else if (cd) d=nd; else if (fd) d=fd; else d=gd;
if (d)
if (d && d->isLinkable())
{
//printf("d->getOutputBase()=`%s' name=`%s'\n",d->getOutputFileBase().data(),md->name().data());
//result.writeCodeLink(d->getReference(),d->getOutputFileBase(),
// md->anchor(),text ? text : memberName);
writeMultiLineCodeLink(result,d->getReference(),d->getOutputFileBase(),
md->anchor(),text ? text : memberName);
return TRUE;
......@@ -413,7 +437,7 @@ static void generateMemberLink(OutputList &ol,const char *varName,
else
{
ClassDef *vcd = getClass(g_classScope);
if (vcd)
if (vcd && vcd->isLinkable())
{
//printf("Found class for variable `%s'\n",varName);
MemberName *vmn=memberNameDict[varName];
......@@ -427,7 +451,7 @@ static void generateMemberLink(OutputList &ol,const char *varName,
{
//printf("Found variable type=%s\n",vmd->typeString());
ClassDef *mcd=stripClassName(vmd->typeString());
if (mcd)
if (mcd && mcd->isLinkable())
{
MemberName *mmn=memberNameDict[memName];
if (mmn)
......@@ -438,8 +462,6 @@ static void generateMemberLink(OutputList &ol,const char *varName,
{
if (mmd->memberClass()==mcd)
{
//ol.writeCodeLink(mcd->getReference(),mcd->getOutputFileBase(),
// mmd->anchor(),memName);
writeMultiLineCodeLink(ol,mcd->getReference(),
mcd->getOutputFileBase(),mmd->anchor(),memName);
return;
......@@ -519,6 +541,22 @@ static int countLines()
return count;
}
static void endFontClass()
{
if (g_currentFontClass)
{
g_code->endFontClass();
g_currentFontClass=0;
}
}
static void startFontClass(const char *s)
{
endFontClass();
g_code->startFontClass(s);
g_currentFontClass=s;
}
/* -----------------------------------------------------------------
*/
#undef YY_INPUT
......@@ -541,6 +579,8 @@ B [ \t]
BN [ \t\n\r]
ID [a-z_A-Z][a-z_A-Z0-9]*
SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
KEYWORD ("asm"|"auto"|"break"|"case"|"catch"|"class"|"const_cast"|"continue"|"default"|"delete"|"do"|"dynamic_cast"|"else"|"enum"|"explicit"|"extern"|"false"|"for"|"friend"|"goto"|"if"|"inline"|"mutable"|"namespace"|"new"|"operator"|"private"|"protected"|"public"|"register"|"reinterpret_cast"|"return"|"sizeof"|"static"|"static_cast"|"struct"|"switch"|"template"|"this"|"throw"|"true"|"try"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"while")
TYPEKW ("bool"|"char"|"const"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"|"void"|"wchar_t")
%option noyywrap
......@@ -564,11 +604,14 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
<*>\x0d
<Body>^([ \t]*"#"[ \t]"include"[ \t]*)("<"|"\"") {
startFontClass("preprocessor");
g_code->codify(yytext);
BEGIN( ReadInclude );
}
<Body>("class"|"struct"|"union")[ \t\n]+ {
startFontClass("keyword");
codifyLines(yytext);
endFontClass();
//g_code->codify(yytext);
BEGIN( ClassName );
}
......@@ -589,9 +632,11 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
QCString text;
text+=c;
g_code->codify(text);
endFontClass();
BEGIN( Body );
}
<Body>^[ \t]*"#" {
startFontClass("preprocessor");
g_code->codify(yytext);
BEGIN( SkipCPP ) ;
}
......@@ -603,6 +648,7 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
}
<SkipCPP>\n {
codifyLines(yytext);
endFontClass();
BEGIN( Body ) ;
}
<SkipCPP>"//" {
......@@ -653,17 +699,10 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
}
BEGIN( Body );
}
<Bases>"virtual" {
g_code->codify(yytext);
}
<Bases>"public" {
g_code->codify(yytext);
}
<Bases>"protected" {
g_code->codify(yytext);
}
<Bases>"private" {
<Bases>"virtual"|"public"|"protected"|"private" {
startFontClass("keyword");
g_code->codify(yytext);
endFontClass();
}
<Bases>{ID} {
//printf("%s:addBase(%s)\n",g_ccd.name.data(),yytext);
......@@ -689,12 +728,24 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
}
<Body>("asm"|"auto"|"break"|"case"|"catch"|"continue"|"default"|"delete"|"do"|"else"|"for"|"goto"|"if"|"new"|"return"|"switch"|"this"|"throw"|"try"|"typedef"|"while")([ \t\n]*)/"(" {
<Body>{KEYWORD}/([^a-z_A-Z0-9]) {
startFontClass("keyword");
codifyLines(yytext);
g_name.resize(0);g_type.resize(0);
endFontClass();
}
<Body>{KEYWORD}/{B}* {
startFontClass("keyword");
codifyLines(yytext);
endFontClass();
}
<Body>("asm"|"auto"|"break"|"case"|"catch"|"continue"|"default"|"delete"|"do"|"else"|"for"|"goto"|"if"|"new"|"return"|"switch"|"this"|"throw"|"try"|"typedef"|"while")([ \t\n]*) {
<Body>{KEYWORD}/{B}*"(" {
startFontClass("keyword");
codifyLines(yytext);
endFontClass();
g_name.resize(0);g_type.resize(0);
}
<Body>[\\|\)\+\-\/\%\~\!] {
g_code->codify(yytext);
g_name.resize(0);g_type.resize(0);
}
/*
......@@ -704,7 +755,21 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
name+=yytext;
}
*/
<Body>{SCOPENAME}/[ \t\n]* {
<Body>{TYPEKW}/{B}* {
startFontClass("keyword");
g_code->codify(yytext);
endFontClass();
addType();
g_name+=yytext;
}
<Body>{SCOPENAME}{B}*"<"[^\}\{\(\)\/\n\>]*">"/{B}* {
int i;
generateClassLink(*g_code,yytext,&i);
addType();
QCString text=yytext;
g_name+=text.left(i);
}
<Body>{SCOPENAME}/{B}* {
generateClassLink(*g_code,yytext);
//codifyLines(yytext);
addType();
......@@ -778,6 +843,13 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
<Body>[0-9]+ {
g_code->codify(yytext);
}
<MemberCall2,FuncCall>({KEYWORD}|{TYPEKW})/([^a-z_A-Z0-9]) {
addParmType();
g_parmName=yytext;
startFontClass("keyword");
g_code->codify(yytext);
endFontClass();
}
<MemberCall2,FuncCall>[a-z_A-Z][:a-z_A-Z0-9]* {
addParmType();
g_parmName=yytext;
......@@ -808,15 +880,21 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
g_parmType.resize(0);g_parmName.resize(0);
BEGIN( Body );
}
<MemberCall2,FuncCall>")"[ \t\n]*"{" {
<MemberCall2,FuncCall>")"({BN}"const"|"volatile")*{BN}*"{" {
addParameter();
g_parmType.resize(0);g_parmName.resize(0);
if (g_name.find("::")!=-1) setClassScope(g_name);
codifyLines(yytext);
g_code->codify(")");
startFontClass("keyword");
yytext[yyleng-1]='\0';
codifyLines(yytext+1);
endFontClass();
g_code->codify("{");
g_curlyCount++;
g_type.resize(0); g_name.resize(0);
BEGIN( Body );
}
/*
<MemberCall2,FuncCall>")"[ \t\n]*":" {
addParameter();
g_parmType.resize(0);g_parmName.resize(0);
......@@ -825,6 +903,7 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
g_type.resize(0); g_name.resize(0);
BEGIN( SkipInits );
}
*/
<SkipInits>"{" {
g_code->codify(yytext);
g_curlyCount++;
......@@ -861,13 +940,21 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
}
<SkipComment>[ \t]*"*/" {
g_code->codify(yytext);
endFontClass();
BEGIN( g_lastCContext ) ;
}
<SkipCxxComment>.*/\n {
//codifyLines(yytext);
<SkipCxxComment>[^\r\n]* {
g_code->codify(yytext);
}
<SkipCxxComment>\r
<SkipCxxComment>\n {
unput('\n');
endFontClass();
BEGIN( g_lastCContext ) ;
}
<SkipCxxComment>. {
g_code->codify(yytext);
}
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*{B}*"/*"[*!]/[^/*] {
g_yyLineNr+=QCString(yytext).contains('\n');
}
......@@ -899,7 +986,9 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
}
else
{
startFontClass("comment");
codifyLines(yytext);
endFontClass();
}
}
<*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment
......@@ -914,7 +1003,9 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
}
else
{
startFontClass("comment");
codifyLines(yytext);
endFontClass();
}
}
<*>"//"[!/][^\n]*\n { // strip special one-line comment
......@@ -925,7 +1016,9 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
}
else
{
startFontClass("comment");
codifyLines(yytext);
endFontClass();
}
}
<*>\n{B}*"/*"[!*]/[^/*] {
......@@ -938,6 +1031,7 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
else
{
g_lastCContext = YY_START ;
startFontClass("comment");
codifyLines(yytext);
BEGIN(SkipComment);
}
......@@ -951,6 +1045,7 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
else
{
g_lastCContext = YY_START ;
startFontClass("comment");
g_code->codify(yytext);
BEGIN(SkipComment);
}
......@@ -964,21 +1059,26 @@ SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
else
{
g_lastCContext = YY_START ;
startFontClass("comment");
g_code->codify(yytext);
BEGIN(SkipComment);
}
}
<*>"/*"("!"?)"*/" { if (!Config::stripCommentsFlag)
{
startFontClass("comment");
g_code->codify(yytext);
endFontClass();
}
}
<*>"/*" {
startFontClass("comment");
g_code->codify(yytext);
g_lastCContext = YY_START ;
BEGIN( SkipComment ) ;
}
<*>"//" {
startFontClass("comment");
g_code->codify(yytext);
g_lastCContext = YY_START ;
BEGIN( SkipCxxComment ) ;
......@@ -1025,6 +1125,7 @@ void parseCode(OutputList &ol,const char *className,const QCString &s,
if (s.isEmpty()) return;
g_inputString = s;
g_inputPosition = 0;
g_currentFontClass = 0;
if (endLine!=-1)
g_inputLines = endLine+1;
else
......@@ -1051,6 +1152,7 @@ void parseCode(OutputList &ol,const char *className,const QCString &s,
codeYYrestart( codeYYin );
BEGIN( Body );
codeYYlex();
endFontClass();
//if (g_yyLineNr<=g_inputLines) code->endCodeLine();
ol+=*g_code;
delete g_code;
......
......@@ -1808,8 +1808,17 @@ static void substEnvVarsInStrList(QStrList &sl)
while (s)
{
QCString result(s);
bool wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1);
substEnvVarsInString(result);
if (!wasQuoted) /* as a result of the expansion, a single string
may have expanded into a list, which we'll
add to sl. If the orginal string already
contained multiple elements no splitting is done! */
{
int l=result.length();
int i,p=0;
// skip spaces
......@@ -1868,6 +1877,11 @@ static void substEnvVarsInStrList(QStrList &sl)
else // just removed last item
s = 0;
}
else // just goto the next element in the list
{
s=sl.next();
}
}
}
......
......@@ -56,7 +56,7 @@ static void addType()
//printf("addType() type=`%s' scope=`%s' name=`%s'\n",
// type.data(),scope.data(),name.data());
if (name.isEmpty() && scope.isEmpty()) return;
if (!type.isEmpty()) type+=' ';
if (!type.isEmpty()) type+=" ";
if (!scope.isEmpty()) type+=scope+"::";
type+=name;
scope.resize(0);
......
......@@ -48,9 +48,12 @@ class Definition
/*! sets a new \a name for the definition */
void setName(const char *name) { n=name; }
/*! sets the documentation of this definition to \a d. */
void setDocumentation(const char *d)
void setDocumentation(const char *d,bool stripWhiteSpace=TRUE)
{
if (stripWhiteSpace)
doc=((QCString)d).stripWhiteSpace();
else
doc=d;
}
/*! sets the brief description of this definition to \a b.
* A dot is added to the sentence if not available.
......
......@@ -196,7 +196,14 @@ DiagramItem::~DiagramItem()
QCString DiagramItem::label() const
{
return classDef->name()+templSpec;
if (!templSpec.isEmpty())
{
return insertTemplateSpecifierInScope(classDef->name(),templSpec);
}
else
{
return classDef->name();
}
}
QCString DiagramItem::fileName() const
......
......@@ -277,6 +277,19 @@ void DotNode::deleteNode(DotNodeList &deletedList)
deletedList.append(this);
}
static QCString convertLabel(const QCString &l)
{
QCString result;
const char *p=l.data();
char c;
while ((c=*p++))
{
if (c=='\\') result+="\\\\";
else result+=c;
}
return result;
}
void DotNode::writeBox(QTextStream &t,bool hasNonReachableChildren)
{
const char *labCol =
......@@ -284,7 +297,8 @@ void DotNode::writeBox(QTextStream &t,bool hasNonReachableChildren)
(
(hasNonReachableChildren) ? "red" : "black"
);
t << " Node" << m_number << " [shape=\"box\",label=\"" << m_label
t << " Node" << m_number << " [shape=\"box\",label=\""
<< convertLabel(m_label)
<< "\",fontsize=10,height=0.2,width=0.4,fontname=\"doxfont\"";
t << ",color=\"" << labCol << "\"";
if (m_isRoot)
......
......@@ -258,7 +258,10 @@ void buildFileList(Entry *root)
}
else
{
fd->setDocumentation(root->doc);
// using FALSE in setDocumentation is small hack to make sure a file
// is documented even if a \file command is used without further
// documentation
fd->setDocumentation(root->doc,FALSE);
fd->setBriefDescription(root->brief);
fd->addSectionsToDefinition(root->anchors);
QListIterator<QCString> sli(*root->groups);
......@@ -1729,12 +1732,13 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
if (baseClassName!=root->name) // check for base class with the same name,
// look in the outer scope for a match
{
//printf("baseClass %s of %s found (%s and %s)\n",
// baseClassName.data(),
// root->name.data(),
// (bi->prot==Private)?"private":((bi->prot==Protected)?"protected":"public"),
// (bi->virt==Normal)?"normal":"virtual"
// );
Debug::print(
Debug::Classes,0,"baseClass %s of %s found (%s and %s)\n",
baseClassName.data(),
root->name.data(),
(bi->prot==Private)?"private":((bi->prot==Protected)?"protected":"public"),
(bi->virt==Normal)?"normal":"virtual"
);
int i;
QCString templSpec;
......@@ -1743,12 +1747,16 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
{
// TODO: here we should try to find the correct template specialization
// but for now, we only look for the unspecializated base class.
templSpec=baseClassName.right(baseClassName.length()-i);
baseClassName=baseClassName.left(i);
int e = baseClassName.find('>');
if (e!=-1)
{
templSpec=baseClassName.mid(i,e-i+1);
baseClassName=baseClassName.left(i)+baseClassName.right(baseClassName.length()-e-1);
baseClass=getResolvedClass(baseClassName);
//printf("baseClass=%p baseClass=%s templSpec=%s\n",
// baseClass,baseClassName.data(),templSpec.data());
}
}
bool found=baseClass!=0 && baseClass!=cd;
NamespaceDef *nd=cd->getNamespace();
......@@ -1819,7 +1827,6 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
}
else
{
//printf(">>> base class %s not found!\n",bi->name.data());
Debug::print(Debug::Classes,0," Base class `%s' not found\n",bi->name.data());
}
}
......@@ -2063,33 +2070,6 @@ void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl,
}
}
//----------------------------------------------------------------------
static QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &templ)
{
QCString result=scope.copy();
if (!templ.isEmpty() && scope.find('<')==-1)
{
int si,pi=0;
while ((si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ)
&& !getClass(scope.left(si)))
{ //printf("Tried `%s'\n",(scope.left(si)+templ).data());
pi=si+2;
}
if (si==-1) // not nested => append template specifier
{
result+=templ;
}
else // nested => insert template specifier before after first class name
{
result=scope.left(si) + templ + scope.right(scope.length()-si);
}
}
//printf("insertTemplateSpecifierInScope(`%s',`%s')=%s\n",
// scope.data(),templ.data(),result.data());
return result;
}
//----------------------------------------------------------------------
// find a class definition given the scope name and (optionally) a
// template list specifier
......@@ -2573,9 +2553,6 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
QCString fullFuncDecl=funcDecl.copy();
if (isFunc) fullFuncDecl+=argListToString(root->argList);
//printf("scopeName=`%s' className=`%s'\n",scopeName.data(),className.data());
//printf("scopeName=`%s' className=`%s'\n",scopeName.data(),className.data());
// destructor => do backward class name substitution if needed
//if (!funcName.isEmpty() && funcName[0]=='~')
// funcName="~"+resolveDefines(className);
......@@ -3681,12 +3658,6 @@ void generateClassDocs()
msg("Generating hierarchical class index...\n");
writeHierarchicalIndex(*outputList);
//if (documentedIncludeFiles>0)
//{
// msg("Generating header index...\n");
// writeHeaderIndex(*outputList);
//}
msg("Generating member index...\n");
writeMemberIndex(*outputList);
......@@ -3706,11 +3677,6 @@ void generateClassDocs()
cd->writeDocumentation(*outputList);
cd->writeMemberList(*outputList);
//DotGfxUsageGraph usageIntfGraph(cd,FALSE,1);
//usageIntfGraph.writeGraph(Config::htmlOutputDir,FALSE);
//if (Config::verbatimHeaderFlag) cd->writeIncludeFile(*outputList);
}
}
}
......@@ -4262,12 +4228,13 @@ void generateSearchIndex()
err("Error: Cannot open file %s for writing\n",fileName.data());
}
//outputList->generateExternalIndex();
outputList->pushGeneratorState();
outputList->disableAllBut(OutputGenerator::Html);
startFile(*outputList,"header.html","Search Engine",TRUE);
outputList->endPlainFile();
outputList->startPlainFile("footer.html");
endFile(*outputList,TRUE);
outputList->enableAll();
outputList->popGeneratorState();
}
}
......@@ -5161,9 +5128,6 @@ int main(int argc,char **argv)
msg("Generating group documentation...\n");
generateGroupDocs();
//msg("Generating member group documentation...\n");
//generateMemberGroupDocs();
msg("Generating namespace index...\n");
generateNamespaceDocs();
......@@ -5186,6 +5150,7 @@ int main(int argc,char **argv)
generateSearchIndex();
msg("Generating style sheet...\n");
//outputList->enable(OutputGenerator::Latex);
outputList->writeStyleInfo(0); // write first part
outputList->disableAllBut(OutputGenerator::Latex);
parseText(*outputList,
......
......@@ -247,53 +247,8 @@ void FileDef::writeDocumentation(OutputList &ol)
}
if (found) ol.endMemberList();
}
if (classList->count()>0)
{
ClassDef *cd=classList->first();
bool found=FALSE;
while (cd)
{
if (cd->name().find('@')==-1)
{
if (!found)
{
ol.startMemberHeader();
parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startMemberList();
found=TRUE;
}
ol.startMemberItem(FALSE);
switch (cd->compoundType())
{
case ClassDef::Class: ol.writeString("class"); break;
case ClassDef::Struct: ol.writeString("struct"); break;
case ClassDef::Union: ol.writeString("union"); break;
case ClassDef::Interface: ol.writeString("interface"); break;
case ClassDef::Exception: ol.writeString("exception"); break;
}
ol.writeString(" ");
ol.insertMemberAlign();
if (cd->isLinkable())
{
ol.writeObjectLink(cd->getReference(),
cd->getOutputFileBase(),
0,
cd->name()
);
}
else
{
ol.startBold();
ol.docify(cd->name());
ol.endBold();
}
ol.endMemberItem(FALSE);
}
cd=classList->next();
}
if (found) ol.endMemberList();
}
classList->writeDeclaration(ol);
/* write user defined member groups */
MemberGroupListIterator mgli(*memberGroupList);
......@@ -309,8 +264,10 @@ void FileDef::writeDocumentation(OutputList &ol)
//doc=doc.stripWhiteSpace();
//int bl=brief.length();
//int dl=doc.length();
if (!briefDescription().isEmpty() || !documentation().isEmpty() ||
startBodyLine!=-1)
if ((!briefDescription().isEmpty() && Config::repeatBriefFlag) ||
!documentation().isEmpty()
/* || startBodyLine!=-1 */
)
{
ol.writeRuler();
ol.pushGeneratorState();
......@@ -395,15 +352,15 @@ void FileDef::writeDocumentation(OutputList &ol)
enumMembers.writeDocumentation(ol,name());
}
enumValMembers.countDocMembers();
if (enumValMembers.totalCount()>0 )
{
ol.writeRuler();
ol.startGroupHeader();
parseText(ol,theTranslator->trEnumerationValueDocumentation());
ol.endGroupHeader();
enumValMembers.writeDocumentation(ol,name());
}
//enumValMembers.countDocMembers();
//if (enumValMembers.totalCount()>0 )
//{
// ol.writeRuler();
// ol.startGroupHeader();
// parseText(ol,theTranslator->trEnumerationValueDocumentation());
// ol.endGroupHeader();
// enumValMembers.writeDocumentation(ol,name());
//}
funcMembers.countDocMembers();
if (funcMembers.totalCount()>0 )
......
......@@ -188,45 +188,9 @@ void GroupDef::writeDocumentation(OutputList &ol)
}
ol.endMemberList();
}
if (classList->count()>0)
{
ClassDef *cd=classList->first();
bool found=FALSE;
while (cd)
{
if (!found)
{
ol.startMemberHeader();
parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startMemberList();
found=TRUE;
}
QCString type;
switch (cd->compoundType())
{
case ClassDef::Class: type="class"; break;
case ClassDef::Struct: type="struct"; break;
case ClassDef::Union: type="union"; break;
case ClassDef::Interface: type="interface"; break;
case ClassDef::Exception: type="exception"; break;
}
ol.startMemberItem(0);
ol.docify(type);
ol.insertMemberAlign();
ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->name());
ol.endMemberItem(FALSE);
if (!cd->briefDescription().isEmpty() && Config::briefMemDescFlag)
{
ol.startMemberDescription();
parseDoc(ol,0,0,cd->briefDescription());
ol.endMemberDescription();
ol.newParagraph();
}
cd=classList->next();
}
if (found) ol.endMemberList();
}
classList->writeDeclaration(ol);
if (allMemberList->count()>0)
{
/* write user defined member groups */
......@@ -306,15 +270,15 @@ void GroupDef::writeDocumentation(OutputList &ol)
enumMembers.writeDocumentation(ol,name());
}
enumValMembers.countDocMembers();
if (enumValMembers.totalCount()>0 )
{
ol.writeRuler();
ol.startGroupHeader();
parseText(ol,theTranslator->trEnumerationValueDocumentation());
ol.endGroupHeader();
enumValMembers.writeDocumentation(ol,name());
}
//enumValMembers.countDocMembers();
//if (enumValMembers.totalCount()>0 )
//{
// ol.writeRuler();
// ol.startGroupHeader();
// parseText(ol,theTranslator->trEnumerationValueDocumentation());
// ol.endGroupHeader();
// enumValMembers.writeDocumentation(ol,name());
//}
funcMembers.countDocMembers();
if (funcMembers.totalCount()>0 )
......
......@@ -207,6 +207,9 @@ void HtmlGenerator::writeStyleInfo(int part)
t << "TD.md { background-color: #f2f2ff }" << endl;
t << "DIV.groupHeader { margin-left: 16; margin-top: 12; margin-bottom: 6; font-weight: bold }" << endl;
t << "DIV.groupText { margin-left: 16; font-style: italic; font-size: smaller }" << endl;
t << "FONT.keyword { color: #008000 }" << endl;
t << "FONT.comment { color: #800000 }" << endl;
t << "FONT.preprocessor { color: #806020 }" << endl;
//t << "TD.groupLine { background-color: #3080ff }" << endl;
t << endl;
endPlainFile();
......
......@@ -227,6 +227,9 @@ class HtmlGenerator : public OutputGenerator
void startParameter(bool first);
void endParameter(bool last);
void startFontClass(const char *s) { t << "<font class=\"" << s << "\">"; }
void endFontClass() { t << "</font>"; }
private:
QCString header;
QCString footer;
......
......@@ -828,15 +828,16 @@ void writeAlphabeticalClassList(OutputList &ol)
void writeAlphabeticalIndex(OutputList &ol)
{
ol.disableAllBut(OutputGenerator::Html);
if (annotatedClasses==0) return;
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
startFile(ol,"classes.html","Alphabetical index");
startTitle(ol,0);
parseText(ol,Config::projectName+" "+theTranslator->trCompoundIndex());
endTitle(ol,0,0);
writeAlphabeticalClassList(ol);
endFile(ol);
ol.enableAll();
ol.popGeneratorState();
}
//----------------------------------------------------------------------------
......
......@@ -27,6 +27,7 @@
#include "translator_es.h"
#include "translator_fi.h"
#include "translator_ru.h"
#include "translator_hr.h"
#endif
#define L_EQUAL(a) !stricmp(langName,a)
......@@ -80,6 +81,10 @@ bool setTranslator(const char *langName)
{
theTranslator=new TranslatorRussian;
}
else if (L_EQUAL("croatian"))
{
theTranslator=new TranslatorCroatian;
}
#endif
else // use the default language (i.e. english)
{
......
......@@ -195,7 +195,11 @@ void LatexGenerator::startIndexSection(IndexSections is)
{
if (theTranslator->latexBabelPackage()=="russian")
{
t << "\\usepackage{inputenc}\n";
#if defined(_WIN32)
t << "\\usepackage[cp1251]{inputenc}\n";
#else
t << "\\usepackage[koi8-r]{inputenc}\n";
#endif
}
t << "\\usepackage[" << theTranslator->latexBabelPackage() << "]{babel}\n";
}
......
......@@ -222,6 +222,9 @@ class LatexGenerator : public OutputGenerator
void startParameter(bool) {}
void endParameter(bool) {}
void startFontClass(const char *) {}
void endFontClass() {}
private:
LatexGenerator(const LatexGenerator &);
LatexGenerator &operator=(const LatexGenerator &);
......
......@@ -209,6 +209,9 @@ class ManGenerator : public OutputGenerator
void startParameter(bool) {}
void endParameter(bool) {}
void startFontClass(const char *) {}
void endFontClass() {}
private:
bool firstCol;
bool paragraph;
......
......@@ -259,6 +259,7 @@ MemberDef::MemberDef(const char *t,const char *na,const char *a,const char *e,
annMemb=0;
annUsed=FALSE;
annShown=FALSE;
annEnumType=0;
indDepth=0;
section=0;
docEnumValues=FALSE;
......@@ -463,7 +464,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
// name().data(),cd->name().data(),annScope,annMemb);
//}
// hide members in annonymous scopes
// hide members in anonymous scopes
// (they are displayed by there parent placeholder)
if (annScope) return;
// hide undocumented members unless overwritten by the configuration
......@@ -535,16 +536,16 @@ void MemberDef::writeDeclaration(OutputList &ol,
bool hasHtmlHelp = Config::generateHtml && Config::htmlHelpFlag;
if (hasHtmlHelp) htmlHelp = HtmlHelp::getInstance();
// search for the last annonymous scope in the member type
// search for the last anonymous scope in the member type
ClassDef *annoClassDef=0;
//while (i!=-1 && cname.find(type.mid(i,l))!=-1)
//{
// i=r.match(type,i+l,&l);
//}
int il=i-1,ir=i+l;
if (i!=-1) // found annonymous scope in type
if (i!=-1) // found anonymous scope in type
{
// extract annonymous scope
// extract anonymous scope
while (il>=0 && (isId(type.at(il)) || type.at(il)==':' || type.at(il)=='@')) il--;
if (il>0) il++;
while (ir<(int)type.length() && (isId(type.at(ir)) || type.at(ir)==':' || type.at(ir)=='@')) ir++;
......@@ -569,7 +570,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
}
// start a new member declaration
ol.startMemberItem(/* gId!=-1,*/(annoClassDef || annMemb) ? 1 : 0);
ol.startMemberItem((annoClassDef || annMemb || annEnumType) ? 1 : 0);
// If there is no detailed description we need to write the anchor here.
bool detailsVisible = detailsAreVisible();
......@@ -605,12 +606,12 @@ void MemberDef::writeDeclaration(OutputList &ol,
writeTemplatePrefix(ol,tArgList,FALSE);
}
if (i!=-1) // render member with annonymous componound as result type.
if (i!=-1) // member has an anonymous type
{
//printf("annoClassDef=%p annMemb=%p scopeName=`%s' annonymous=`%s'\n",
//printf("annoClassDef=%p annMemb=%p scopeName=`%s' anonymous=`%s'\n",
// annoClassDef,annMemb,cname.data(),type.mid(i,l).data());
if (annoClassDef)
if (annoClassDef) // type is an anonymous compound
{
//printf("class found!\n");
annoClassDef->writeDeclaration(ol,annMemb,inGroup);
......@@ -632,11 +633,20 @@ void MemberDef::writeDeclaration(OutputList &ol,
}
}
else
{
if (getAnonymousEnumType()) // type is an anonymous enum
{
linkifyText(ol,cname,name(),type.left(i),TRUE);
ol+=*getAnonymousEnumType()->enumDecl();
linkifyText(ol,cname,name(),type.right(type.length()-i-l),TRUE);
}
else
{
type = type.left(i) + " { ... } " + type.right(type.length()-i-l);
linkifyText(ol,cname,name(),type,TRUE);
}
}
}
else
{
linkifyText(ol,cname,name(),type,TRUE);
......@@ -749,7 +759,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
ol.endDoxyAnchor();
}
ol.endMemberItem(annoClassDef!=0 && indDepth==0);
ol.endMemberItem((annoClassDef!=0 && indDepth==0) || annEnumType);
//ol.endMemberItem(gId!=-1,gFile,gHeader,annoClassDef || annMemb);
// write brief description
......@@ -775,7 +785,9 @@ void MemberDef::writeDeclaration(OutputList &ol,
warnIfUndocumented();
}
/*! Writes the "detailed documentation" section of this member to
* all active output formats.
*/
void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
const char *scopeName)
{
......@@ -783,37 +795,52 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
bool hasDocs = detailsAreVisible();
//printf("MemberDef::writeDocumentation(): type=`%s' def=`%s'\n",type.data(),definition());
if (
(/*memberType()==m &&*/ // filter member type
(Config::extractAllFlag || hasDocs)
/*&& groupId()==-1 */ // not in a group
) || /* member is part of an annonymous scope that is the type of
Config::extractAllFlag || hasDocs
|| /* member is part of an anonymous scope that is the type of
* another member in the list.
*/
(!hasDocs && !briefDescription().isEmpty() && annUsed)
)
{
// get definition. TODO: make a method of this
NamespaceDef *nd=getNamespace();
ClassDef *cd=memberClass();
FileDef *fd=getFileDef();
Definition *d = 0;
if (cd) d=cd; else if (nd) d=nd; else d=fd;
ASSERT(d!=0);
QCString cname = d->name();
QCString cfname = d->getOutputFileBase();
// get member name
QCString doxyName=name().copy();
// prepend scope if there is any
// prepend scope if there is any. TODO: make this optional for C only docs
if (scopeName) doxyName.prepend((QCString)scopeName+"::");
QCString def = definition();
if (isEnumerate()) def.prepend("enum ");
MemberDef *smd;
if (isEnumValue() && def[0]=='@') def = def.right(def.length()-2);
int i=0,l,dummy;
if (isEnumerate())
{
if (name().at(0)=='@')
{
def = "anonymous enum";
}
else
{
def.prepend("enum ");
}
}
int i=0,l;
static QRegExp r("@[0-9]+");
if (isEnumerate() && r.match(def,0,&l)!=-1) return;
if (isEnumValue() && (smd = getEnumScope())
&& r.match(smd->name(),0,&dummy)==-1) return;
//ENUM
if (isEnumValue()) return;
//if (isEnumValue() && def[0]=='@') def = def.right(def.length()-2);
//int dummy;
//if (isEnumerate() && r.match(def,0,&l)!=-1) return;
//MemberDef *smd;
//if (isEnumValue() && (smd = getEnumScope())
// && r.match(smd->name(),0,&dummy)==-1) return;
ol.pushGeneratorState();
......@@ -823,7 +850,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if ((isVariable() || isTypedef()) && (i=r.match(def,0,&l))!=-1)
{
// find enum type an insert it in the definition
// find enum type and insert it in the definition
MemberListIterator vmli(*ml);
MemberDef *vmd;
bool found=FALSE;
......@@ -840,7 +867,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
linkifyText(ol,scopeName,name(),def.left(i));
ol+=*vmd->enumDecl();
linkifyText(ol,scopeName,name(),def.right(def.length()-i-l));
//ol.endDoxyAnchor();
found=TRUE;
}
......@@ -854,7 +880,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
{
htmlHelp->addIndexItem(cname,name(),cfname,anchor());
}
// strip annonymous compound names from definition
// strip anonymous compound names from definition
int si=def.find(' '),pi,ei=i+l;
if (si==-1) si=0;
while ((pi=r.match(def,i+l,&l))!=-1) ei=i=pi+l;
......@@ -1329,6 +1355,7 @@ bool MemberDef::detailsAreVisible() const
void MemberDef::setEnumDecl(OutputList &ed)
{
enumDeclList=new OutputList(&ed);
*enumDeclList+=ed;
}
bool MemberDef::hasDocumentation()
......
......@@ -133,6 +133,8 @@ class MemberDef : public Definition
MemberList *enumFieldList() { return enumFields; }
void setDocumentedEnumValues(bool value) { docEnumValues=value; }
bool hasDocumentedEnumValues() const { return docEnumValues; }
void setAnonymousEnumType(MemberDef *md) { annEnumType = md; }
MemberDef *getAnonymousEnumType() { return annEnumType; }
// example related members
bool addExample(const char *anchor,const char *name,const char *file);
......@@ -199,6 +201,7 @@ class MemberDef : public Definition
FileDef *fileDec; // member of file declaration
MemberDef *redefines; // the member that is redefined by this one
MemberDef *enumScope; // the enclosing scope, if this is an enum field
MemberDef *annEnumType; // the annonymous enum that is the type of this member
MemberList *redefinedBy; // the list of members that redefine this one
MemberDef *memDef; // member definition for this declaration
MemberDef *memDec; // member declaration for this definition
......
......@@ -304,19 +304,25 @@ void MemberList::writePlainDeclarations(OutputList &ol,
ol.startMemberList();
}
MemberListIterator mli(*this);
for ( ; (md=mli.current()) ; ++mli )
for ( ; (md=mli.current()) ; ++mli ) // iterate through the members
{
// see if member is hidden by protection
if (md->protection()==Private && !Config::extractPrivateFlag) continue;
/*bool hasDocs=md->hasDocumentation();*/
QCString type=md->typeString();
type=type.stripWhiteSpace();
type=type.stripWhiteSpace(); // TODO: is this really needed?
// filter out enums that are in a group iff inGroup holds
if (md->isEnumerate() && inGroup==(md->getMemberGroup()!=0) /*&& (hasDocs || !Config::hideMemberFlag)*/)
{
if (!Config::hideMemberFlag || // do not hide undocumented members or
// filter out invisible enums
if ( !Config::hideMemberFlag || // do not hide undocumented members or
!md->documentation().isEmpty() || // member has detailed descr. or
md->hasDocumentedEnumValues() || // member has documented enum vales.
Config::briefMemDescFlag || // brief descr. is shown or
Config::repeatBriefFlag // brief descr. is repeated.
(
!md->briefDescription().isEmpty() &&
Config::briefMemDescFlag // brief descr. is shown or
)
)
{
OutputList typeDecl(&ol);
......@@ -325,15 +331,6 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (i!=-1) name=name.right(name.length()-i-2); // strip scope
if (name[0]!='@') // not an anonymous enum
{
//if (Config::extractAllFlag ||
// (md->briefDescription().isEmpty() || !Config::briefMemDescFlag) &&
// (!md->documentation().isEmpty() || md->hasDocumentedEnumValues() ||
// (!md->briefDescription().isEmpty() &&
// !Config::briefMemDescFlag &&
// Config::repeatBriefFlag
// )
// )
// )
if (md->isLinkableInProject() || md->hasDocumentedEnumValues())
{
if (!Config::genTagFile.isEmpty())
......@@ -400,23 +397,29 @@ void MemberList::writePlainDeclarations(OutputList &ol,
for ( ; (vmd=vmli.current()) ; ++vmli)
{
QCString vtype=vmd->typeString();
if ((vtype.find(name))!=-1) enumVars++;
if ((vtype.find(name))!=-1)
{
enumVars++;
vmd->setAnonymousEnumType(md);
}
}
}
if (enumVars==0) // no variable of this enum type
// if this is an annoymous enum and there are variable of this
// enum type (i.e. enumVars>0), then we do not show the enum here.
if (enumVars==0) // show enum here
{
ol.startMemberItem(0);
ol.writeString("enum ");
ol.insertMemberAlign();
ol+=typeDecl;
ol+=typeDecl; // append the enum values.
ol.endMemberItem(FALSE);
//QCString brief=md->briefDescription();
//brief=brief.stripWhiteSpace();
if (!md->briefDescription().isEmpty() && Config::briefMemDescFlag)
{
ol.startMemberDescription();
parseDoc(ol,cd?cd->name().data():0,
md->name().data(),md->briefDescription());
parseDoc(ol,
cd?cd->name().data():0,md->name().data(),
md->briefDescription()
);
if (!md->documentation().isEmpty() || md->hasDocumentedEnumValues())
{
ol.disableAllBut(OutputGenerator::Html);
......@@ -429,9 +432,6 @@ void MemberList::writePlainDeclarations(OutputList &ol,
ol.enableAll();
}
ol.endMemberDescription();
//ol.disable(OutputGenerator::Man);
//ol.newParagraph();
//ol.enable(OutputGenerator::Man);
}
}
md->warnIfUndocumented();
......
......@@ -148,59 +148,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
ol.endTextBlock();
ol.startMemberSections();
if (classList->count()>0)
{
ClassDef *cd=classList->first();
bool found=FALSE;
while (cd)
{
if (cd->name().find('@')==-1)
{
if (!found)
{
ol.startMemberHeader();
parseText(ol,theTranslator->trCompounds());
ol.endMemberHeader();
ol.startMemberList();
found=TRUE;
}
QCString clName=cd->name().copy();
if (clName.left(name().length()+2)==name()+"::")
{
clName = clName.right(clName.length()-name().length()-2);
}
ol.startMemberItem(0);
switch (cd->compoundType())
{
case ClassDef::Class: ol.writeString("class"); break;
case ClassDef::Struct: ol.writeString("struct"); break;
case ClassDef::Union: ol.writeString("union"); break;
case ClassDef::Interface: ol.writeString("interface"); break;
case ClassDef::Exception: ol.writeString("exception"); break;
}
ol.writeString(" ");
ol.insertMemberAlign();
if (cd->isLinkable())
{
ol.writeObjectLink(cd->getReference(),
cd->getOutputFileBase(),
0,
clName
);
}
else
{
ol.startBold();
ol.docify(clName);
ol.endBold();
}
ol.endMemberItem(FALSE);
}
cd=classList->next();
}
if (found) ol.endMemberList();
}
classList->writeDeclaration(ol);
/* write user defined member groups */
MemberGroupListIterator mgli(*memberGroupList);
......@@ -213,7 +161,8 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
allMemberList.writeDeclarations(ol,0,this,0,0,0,0);
ol.endMemberSections();
if (!briefDescription().isEmpty() || !documentation().isEmpty())
if ((!briefDescription().isEmpty() && Config::repeatBriefFlag) ||
!documentation().isEmpty())
{
ol.writeRuler();
ol.pushGeneratorState();
......@@ -281,15 +230,15 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
enumMembers.writeDocumentation(ol,name());
}
enumValMembers.countDocMembers();
if ( enumValMembers.totalCount()>0 )
{
ol.writeRuler();
ol.startGroupHeader();
parseText(ol,theTranslator->trEnumerationValueDocumentation());
ol.endGroupHeader();
enumValMembers.writeDocumentation(ol,name());
}
//enumValMembers.countDocMembers();
//if ( enumValMembers.totalCount()>0 )
//{
// ol.writeRuler();
// ol.startGroupHeader();
// parseText(ol,theTranslator->trEnumerationValueDocumentation());
// ol.endGroupHeader();
// enumValMembers.writeDocumentation(ol,name());
//}
funcMembers.countDocMembers();
if ( funcMembers.totalCount()>0 )
......
......@@ -213,6 +213,9 @@ class OutputGenerator
virtual void startParameter(bool) = 0;
virtual void endParameter(bool) = 0;
virtual void startFontClass(const char *) = 0;
virtual void endFontClass() = 0;
void clear() { b.close(); a.resize(0); b.setBuffer(a);
b.open(IO_WriteOnly); t.setDevice(&b); }
......
......@@ -369,6 +369,11 @@ class OutputList
void endParameter(bool last)
{ forall(&OutputGenerator::endParameter,last); }
void startFontClass(const char *c)
{ forall(&OutputGenerator::startFontClass,c); }
void endFontClass()
{ forall(&OutputGenerator::endFontClass); }
private:
void debug();
void clear();
......
......@@ -125,7 +125,15 @@ static void decrLevel()
static bool otherCaseDone()
{
if (g_level==0)
{
err("Error: Found an #else without a preceding #if.\n");
return TRUE;
}
else
{
return g_levelGuard[g_level-1];
}
}
static void setCaseDone(bool value)
......@@ -1079,7 +1087,7 @@ BN [ \t\r\n]
g_guardExpr.resize(0);
BEGIN(Guard);
}
<Command>"elif"/[ \t(] {
<Command>("elif"|"else"{B}*"if")/[ \t(] {
if (!otherCaseDone())
{
g_guardExpr.resize(0);
......@@ -1107,7 +1115,7 @@ BN [ \t\r\n]
<Command>"undef"{B}+ {
BEGIN(Ung_defName);
}
<Command>"elif"/[ \t(] {
<Command>("elif"|"else"{B}*"if")/[ \t(] {
if (!otherCaseDone())
{
g_guardExpr.resize(0);
......@@ -1208,7 +1216,7 @@ BN [ \t\r\n]
BEGIN(Start);
}
}
<SkipCommand>"elif"/[ \t(] {
<SkipCommand>("elif"|"else"{B}*"if")/[ \t(] {
if (g_ifcount==0)
{
if (!otherCaseDone())
......@@ -1693,6 +1701,7 @@ void preprocessFile(const char *fileName,BufStr &output)
char *defStr = Config::predefined.first();
while (defStr)
{
//printf("Predefined: `%s'\n",defStr);
QCString ds = defStr;
int i_equals=ds.find('=');
int i_obrace=ds.find('(');
......
......@@ -528,41 +528,44 @@ void RTFGenerator::endIndexSection(IndexSections is)
break;
case isMainPage:
t << "\\par " << Rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trMainPage() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"index.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
case isModuleIndex:
t << "\\par " << Rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trModuleIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"modules.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
case isNamespaceIndex:
t << "\\par " << Rtf_Style_Reset << endl;
t << "{\\tc \\v " << theTranslator->trNamespaceIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"namespaces.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
case isClassHierarchyIndex:
t << "\\par " << Rtf_Style_Reset << endl;
t << "{\\tc \\v Hierarchical Index}"<< endl;;
t << "{\\tc \\v " << theTranslator->trHierarchicalIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"hierarchy.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
case isCompoundIndex:
t << "\\par " << Rtf_Style_Reset << endl;
t << "{\\tc \\v Compound Index}"<< endl;;
t << "{\\tc \\v " << theTranslator->trCompoundIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"annotated.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
case isFileIndex:
t << "\\par " << Rtf_Style_Reset << endl;
t << "{\\tc \\v File Index}"<< endl;;
t << "{\\tc \\v " << theTranslator->trFileIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"files.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
case isPageIndex:
t << "\\par " << Rtf_Style_Reset << endl;
t << "{\\tc \\v Page Index}"<< endl;;
t << "{\\tc \\v " << theTranslator->trPageIndex() << "}"<< endl;
t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"pages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
break;
case isModuleDocumentation:
{
GroupDef *gd=groupList.first();
bool found=FALSE;
t << "{\\tc \\v Module Documentation}"<< endl;;
t << "{\\tc \\v " << theTranslator->trModuleDocumentation() << "}"<< endl;
while (gd && !found)
{
if (gd->isLinkableInProject() || gd->countMembers()>0)
......@@ -625,7 +628,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
ClassDef *cd=classList.first();
bool found=FALSE;
t << "{\\tc \\v Class Documentation}"<< endl;;
t << "{\\tc \\v " << theTranslator->trClassDocumentation() << "}"<< endl;
while (cd && !found)
{
if (cd->isLinkableInProject())
......@@ -657,7 +660,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
bool isFirst=TRUE;
FileName *fn=inputNameList.first();
t << "{\\tc \\v File Documentation}"<< endl;
t << "{\\tc \\v " << theTranslator->trFileDocumentation() << "}"<< endl;
while (fn)
{
FileDef *fd=fn->first();
......@@ -692,6 +695,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
{
//t << "}\n";
PageInfo *pi=exampleList.first();
t << "{\\tc \\v " << theTranslator->trExampleDocumentation() << "}"<< endl;
if (pi)
{
t << "\\par " << Rtf_Style_Reset << endl;
......@@ -713,7 +717,7 @@ void RTFGenerator::endIndexSection(IndexSections is)
break;
case isPageDocumentation:
{
t << "{\\tc \\v Page Documentation}"<< endl;;
t << "{\\tc \\v " << theTranslator->trPageDocumentation() << "}"<< endl;
PageInfo *pi=pageList.first();
if (pi)
{
......@@ -1346,7 +1350,7 @@ void RTFGenerator::startDescList()
{
t << "{\\comment (startDescList)}" << endl;
t << "{";
/*if (!m_omitParagraph)*/ newParagraph();
///*if (!m_omitParagraph)*/ newParagraph();
}
void RTFGenerator::endDescTitle()
......@@ -1378,6 +1382,7 @@ void RTFGenerator::endDescList()
void RTFGenerator::writeSection(const char *lab,const char *title,bool sub)
{
t << "{\\comment (writeSection)}" << endl;
t << "{";
t<< Rtf_Style_Reset;
if (sub)
{
......@@ -1404,12 +1409,19 @@ void RTFGenerator::writeSection(const char *lab,const char *title,bool sub)
newParagraph();
// make bookmark
writeAnchor(lab);
t << "}";
}
void RTFGenerator::writeSectionRef(const char *,const char *lab,
const char *)
const char *title)
{
startBold();
docify(title);
endBold();
t << " (";
docify(theTranslator->trPageAbbreviation());
WriteRTFReference(lab);
t << ")" << endl;
}
void RTFGenerator::writeSectionRefItem(const char *,const char *lab,
......@@ -1421,13 +1433,10 @@ void RTFGenerator::writeSectionRefItem(const char *,const char *lab,
t << endl;
}
void RTFGenerator::writeSectionRefAnchor(const char *,const char *lab,
void RTFGenerator::writeSectionRefAnchor(const char *name,const char *lab,
const char *title)
{
startBold();
docify(title);
endBold();
t << " (p.~\\pageref{" << lab << "})" << endl;
writeSectionRef(name,lab,title);
}
void RTFGenerator::docify(const char *str)
......
......@@ -211,6 +211,9 @@ class RTFGenerator : public OutputGenerator
void startParameter(bool) {}
void endParameter(bool) {}
void startFontClass(const char *) {}
void endFontClass() {}
static bool preProcessFileInplace(const char *path,const char *name);
private:
......
......@@ -3773,16 +3773,17 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<BasesProt>"private" { baseProt = Private; }
<BasesProt>{BN} { lineCount(); }
<BasesProt>. { unput(*yytext); BEGIN(Bases); }
<Bases>("::")*{BN}*({ID}{BN}*"::"{BN}*)*{ID} {
<Bases>("::")?{BN}*({ID}{BN}*"::"{BN}*)*{ID} {
//current->extends->append(
// new BaseInfo(yytext,baseProt,baseVirt)
//) ;
if (*yytext != ':')
bool globalScope = *yytext==':' && baseName.isEmpty();
if (!globalScope)
baseName += yytext;
else
baseName += (yytext+2);
current->args += ' ';
if (*yytext != ':')
if (!globalScope)
current->args += yytext;
else
current->args += (yytext+2);
......@@ -4492,7 +4493,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
);
}
<DocBaseClass>\n { yyLineNr++; BEGIN( ClassDoc ); }
<ClassDocBrief>{BS}{BL} {
<ClassDocBrief>{BS}({BL}|"\\n\\n") {
current->brief=current->brief.stripWhiteSpace();
if (!current->doc.isEmpty()) current->doc+="<p>";
yyLineNr++;
......@@ -4659,13 +4660,26 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
unput(afterDocTerminator);
BEGIN(lastAfterDocContext);
}
<ClassDocRelates,ClassDocFunc,ClassDocDefine,GroupDocArg1,ClassDocArg1,SectionTitle,EnumDocArg1,FileDocArg1,PageDocArg1,ExampleDocArg1,ClassDefineArgs,GroupName>"*/" {
<ClassDocRelates,ClassDocFunc,ClassDocDefine,GroupDocArg1,ClassDocArg1,SectionTitle,EnumDocArg1,PageDocArg1,ExampleDocArg1,ClassDefineArgs,GroupName>"*/" {
current->doc += "\n\n";
err("Warning: unexpected end of "
"documentation block found in "
"file %s at line %d\n",yyFileName,yyLineNr);
BEGIN( lastDocContext );
}
<FileDocArg1>"*/" {
current->name = yyFileName;
current->doc += "\n\n";
current_root->addSubEntry(current);
current = new Entry ;
current->protection = protection ;
current->sig = sig;
current->virt = virt;
current->stat = gstat;
current->slot = slot;
current->mGrpId = memberGroupId;
BEGIN( FindMembers );
}
<Doc>"*/" {
checkDocs();
current->doc += "\n\n";
......
......@@ -48,7 +48,7 @@ class TranslatorGerman : public Translator
QCString latexBabelPackage()
// returns the name of the package that is included by LaTeX
{ return "deutsch"; }
{ return "german"; }
QCString trRelatedFunctions()
// used in the compound documentation before a list of related functions.
......
......@@ -248,7 +248,7 @@ QCString removeRedundantWhiteSpace(const QCString &s)
(i!=0 && i!=s.length()-1 && isId(s.at(i-1)) && isId(s.at(i+1)))
)
{
if ((c=='*' || c=='&') &&
if ((c=='*' || c=='&' || c=='@') &&
!result.isEmpty() && isId(result.at(result.length()-1))
) result+=' ';
result+=c;
......@@ -535,7 +535,7 @@ void writeQuickLinks(OutputList &ol,bool compact,bool ext)
//bool texEnabled = ol.isEnabled(OutputGenerator::Latex);
ol.disableAllBut(OutputGenerator::Html);
QCString extLink,absPath;
if (ext) { extLink="_doc:"; absPath="/"; }
if (ext) { extLink="_doc"; absPath="/"; }
//if (manEnabled) ol.disable(OutputGenerator::Man);
//if (texEnabled) ol.disable(OutputGenerator::Latex);
if (compact) ol.startCenter(); else ol.startItemList();
......@@ -2217,3 +2217,27 @@ void extractNamespaceName(const QCString &scopeName,
return;
}
QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &templ)
{
QCString result=scope.copy();
if (!templ.isEmpty() && scope.find('<')==-1)
{
int si,pi=0;
while ((si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ)
&& !getClass(scope.left(si)))
{ //printf("Tried `%s'\n",(scope.left(si)+templ).data());
pi=si+2;
}
if (si==-1) // not nested => append template specifier
{
result+=templ;
}
else // nested => insert template specifier before after first class name
{
result=scope.left(si) + templ + scope.right(scope.length()-si);
}
}
//printf("insertTemplateSpecifierInScope(`%s',`%s')=%s\n",
// scope.data(),templ.data(),result.data());
return result;
}
......@@ -93,5 +93,6 @@ int minClassDistance(ClassDef *cd,ClassDef *bcd,int level=0);
QCString convertNameToFile(const char *name);
void extractNamespaceName(const QCString &scopeName,
QCString &className,QCString &namespaceName);
QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &templ);
#endif
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