Commit 04dd14e8 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.3-rc2-20021224

parent 1a8ff6f0
DOXYGEN Version 1.3-rc2
DOXYGEN Version 1.3-rc2-20021224
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (16 December 2002)
Dimitri van Heesch (24 December 2002)
DOXYGEN Version 1.3_rc2
DOXYGEN Version 1.3_rc2_20021224
Please read INSTALL for compilation instructions.
......@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (16 December 2002)
Dimitri van Heesch (dimitri@stack.nl) (24 December 2002)
1.3-rc2
1.3-rc2-20021224
......@@ -62,7 +62,8 @@ PREDEFINED = MY_MACRO()=
manual for more information.
</ol>
<li><b>When I set EXTRACT_ALL to NO none of my functions are shown in the documentation.</b></li>
<li><b>When I set EXTRACT_ALL to NO none of my functions are shown in the
documentation.</b></li>
In order for global functions, variables, enums, typedefs, and defines
to be documented you should document the file in which these commands are
......@@ -72,6 +73,9 @@ command.
Alternatively, you can put all members in a group (or module)
using the \\ingroup command and then document the group using a comment
block containing the \\defgroup command.
For member functions or functions that are part of a namespace you should
document either the class or namespace.
<li><b>How can I make doxygen ignore some code fragment?</b>
<p>
......
......@@ -181,8 +181,9 @@ Thanks go to:
All language maintainers for providing translations into many languages.
<li>Erik Jan Lingen of <a href="http://www.habanera.nl/">Habanera</a>, Mark
Roddy, Paul Schwartz, Charles Duffy, Vadym Voznyuk, Philip Walton,
Dwight Browne, Andreas Fredriksson, Karel Lindveld, and Ivan Lee
for donating money.
Dwight Browne, Andreas Fredriksson, Karel Lindveld, Ivan Lee, Albert
Vernon, Adam McKee, Vijapurapu Anatharac, Ben Hunsberger and
Walter Wartenweiler for donating money.
<li>The Comms group of <a href="http://www.symbian.com">Symbian</a> for donating
an ultra cool <a href="http://www.psion.com/revoplus">Revo plus</a>
organizer!
......
Summary: A documentation system for C/C++.
Name: doxygen
Version: 1.3_rc2
Version: 1.3_rc2_20021224
Release: 1
Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
......
......@@ -41,7 +41,7 @@ static void replaceCommentMarker(const char *s,int len)
p++;
}
// replace start of comment marker by spaces
while ((c=*p) && (c=='/' || c=='!'))
while ((c=*p) && (c=='/' || c=='!' || c=='#'))
{
g_outBuf->addChar(' ');
p++;
......@@ -109,6 +109,12 @@ static int yyread(char *buf,int max_size)
copyToOutput(yytext+i,yyleng-i);
BEGIN(SComment);
}
<Scan>"//##Documentation".*\n { /* Start of Rational Rose ANSI C++ comment block */
int i=17; //=strlen("//##Documentation");
copyToOutput("/**",3);
copyToOutput(yytext+i,yyleng-i);
BEGIN(SComment);
}
<Scan>"//".*\n { /* one line C++ comment */
copyToOutput(yytext,yyleng);
}
......@@ -180,6 +186,12 @@ static int yyread(char *buf,int max_size)
<SComment>\n[ \t]*"//!".*/\n {
replaceCommentMarker(yytext,yyleng);
}
<SComment>^[ \t]*"//##".*/\n {
replaceCommentMarker(yytext,yyleng);
}
<SComment>\n[ \t]*"//##".*/\n {
replaceCommentMarker(yytext,yyleng);
}
<SComment>\n { /* end of special comment */
copyToOutput(" */",3);
copyToOutput(yytext,yyleng);
......
......@@ -620,6 +620,28 @@ void Definition::setRefItems(const QList<ListItemInfo> *sli)
}
}
void Definition::mergeRefItems(Definition *d)
{
if (d->specialListItems())
{
// deep copy the list
if (m_specialListItems==0)
{
m_specialListItems=new QList<ListItemInfo>;
m_specialListItems->setAutoDelete(TRUE);
}
QListIterator<ListItemInfo> slii(*d->specialListItems());
ListItemInfo *lii;
for (slii.toFirst();(lii=slii.current());++slii)
{
if (getSpecialListId(lii->type)==-1)
{
m_specialListItems->append(new ListItemInfo(*lii));
}
}
}
}
int Definition::getSpecialListId(const char *listName) const
{
if (m_specialListItems)
......
......@@ -113,6 +113,7 @@ class Definition
//int testId() const { return m_testId; }
//int bugId() const { return m_bugId; }
void setRefItems(const QList<ListItemInfo> *sli);
void mergeRefItems(Definition *d);
int getSpecialListId(const char *listName) const;
const QList<ListItemInfo> *specialListItems() const;
......
This diff is collapsed.
......@@ -283,6 +283,7 @@ class DocStyleChange : public DocNode
{ if (attribs) m_attribs=*attribs; }
Kind kind() const { return Kind_StyleChange; }
Style style() const { return m_style; }
const char *styleString() const;
bool enable() const { return m_enable; }
uint position() const { return m_position; }
DocNode *parent() const { return m_parent; }
......
......@@ -162,26 +162,27 @@ static void parseHtmlAttribs(const char *att)
while (i<len && c==' ') { c=attribs.at(++i); }
if (attribs.at(i)=='=') // option has value
{
i++;
c=attribs.at(++i);
// skip spaces
while (i<len && c==' ') { c=attribs.at(++i); }
if (attribs.at(i)=='\'') // option '...'
{
i++;
c=attribs.at(++i);
startAttrib=i;
// search for matching quote
while (i<len && c!='\'') { c=attribs.at(++i); }
endAttrib=i;
i++;
c=attribs.at(++i);
}
else if (attribs.at(i)=='"') // option "..."
{
i++;
c=attribs.at(++i);
startAttrib=i;
// search for matching quote
while (i<len && c!='"') { c=attribs.at(++i); }
endAttrib=i;
i++;
c=attribs.at(++i);
}
else // value without any quotes
{
......@@ -189,7 +190,7 @@ static void parseHtmlAttribs(const char *att)
// search for separator
while (i<len && c!=' ') { c=attribs.at(++i); }
endAttrib=i;
i++;
c=attribs.at(++i);
}
opt.value = attribs.mid(startAttrib,endAttrib-startAttrib);
}
......@@ -378,7 +379,7 @@ LABELID [a-z_A-Z][a-z_A-Z0-9\-]*
g_token->isEMailAddr=FALSE;
return TK_URL;
}
<St_Para>[a-z_A-Z0-9.-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-])+[a-z_A-Z0-9\-]+ { // Mail address
<St_Para>[a-z_A-Z0-9.-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+ { // Mail address
g_token->name=yytext;
g_token->isEMailAddr=TRUE;
return TK_URL;
......@@ -598,7 +599,7 @@ LABELID [a-z_A-Z][a-z_A-Z0-9\-]*
return 0;
}
<St_Ref>{ID} {
<St_Ref>({ID}[.-])*{ID} {
g_token->name=yytext;
return TK_WORD;
}
......
......@@ -2524,8 +2524,8 @@ static void transferFunctionDocumentation()
// mdec->setGroupDef(mdef->getGroupDef(),mdef->getGroupPri(),mdef->docFile(),mdef->docLine(),mdef->hasDocumentation());
//}
mdec->setRefItems(mdef->specialListItems());
mdef->setRefItems(mdec->specialListItems());
mdec->mergeRefItems(mdef);
mdef->mergeRefItems(mdec);
mdef->setMemberDeclaration(mdec);
mdec->setMemberDefinition(mdef);
......
......@@ -166,7 +166,7 @@ void HtmlDocVisitor::visit(DocStyleChange *s)
else
{
m_insidePre=FALSE;
m_t << "</pre>\n";
m_t << "</pre>";
}
}
}
......@@ -279,24 +279,26 @@ void HtmlDocVisitor::visitPre(DocAutoList *l)
{
if (l->isEnumList())
{
m_t << "<ol>\n";
m_t << "<ol>";
}
else
{
m_t << "<ul>\n";
m_t << "<ul>";
}
if (!l->isPreformatted()) m_t << "\n";
}
void HtmlDocVisitor::visitPost(DocAutoList *l)
{
if (l->isEnumList())
{
m_t << "</ol>\n";
m_t << "</ol>";
}
else
{
m_t << "</ul>\n";
m_t << "</ul>";
}
if (!l->isPreformatted()) m_t << "\n";
}
void HtmlDocVisitor::visitPre(DocAutoListItem *)
......@@ -318,8 +320,11 @@ void HtmlDocVisitor::visitPost(DocPara *p)
if (!p->isLast() && // omit <p> for last paragraph
!(p->parent() && // and for parameter sections
p->parent()->kind()==DocNode::Kind_ParamSect
)
) m_t << "\n<p>\n";
)
)
{
m_t << "<p>";
}
}
void HtmlDocVisitor::visitPre(DocRoot *)
......@@ -391,14 +396,16 @@ void HtmlDocVisitor::visitPost(DocTitle *)
m_t << "</b></dt><dd>";
}
void HtmlDocVisitor::visitPre(DocSimpleList *)
void HtmlDocVisitor::visitPre(DocSimpleList *sl)
{
m_t << "<ul>\n";
m_t << "<ul>";
if (!sl->isPreformatted()) m_t << "\n";
}
void HtmlDocVisitor::visitPost(DocSimpleList *)
void HtmlDocVisitor::visitPost(DocSimpleList *sl)
{
m_t << "</ul>\n";
m_t << "</ul>";
if (!sl->isPreformatted()) m_t << "\n";
}
void HtmlDocVisitor::visitPre(DocSimpleListItem *)
......@@ -406,9 +413,10 @@ void HtmlDocVisitor::visitPre(DocSimpleListItem *)
m_t << "<li>";
}
void HtmlDocVisitor::visitPost(DocSimpleListItem *)
void HtmlDocVisitor::visitPost(DocSimpleListItem *li)
{
m_t << "</li>\n";
m_t << "</li>";
if (!li->isPreformatted()) m_t << "\n";
}
void HtmlDocVisitor::visitPre(DocSection *s)
......@@ -435,14 +443,16 @@ void HtmlDocVisitor::visitPre(DocHtmlList *s)
void HtmlDocVisitor::visitPost(DocHtmlList *s)
{
if (s->type()==DocHtmlList::Ordered)
m_t << "</ol>\n";
m_t << "</ol>";
else
m_t << "</ul>\n";
m_t << "</ul>";
if (!s->isPreformatted()) m_t << "\n";
}
void HtmlDocVisitor::visitPre(DocHtmlListItem *i)
{
m_t << "<li" << htmlAttribsToString(i->attribs()) << ">\n";
m_t << "<li" << htmlAttribsToString(i->attribs()) << ">";
if (!i->isPreformatted()) m_t << "\n";
}
void HtmlDocVisitor::visitPost(DocHtmlListItem *)
......
......@@ -706,6 +706,11 @@ void MemberDef::writeDeclaration(OutputList &ol,
if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
QCString cname = d->name();
QCString cfname = d->getOutputFileBase();
QCString osname = cname;
// in case of class members that are put in a group the name of the outerscope
// differs from the cname.
if (getOuterScope()) osname=getOuterScope()->name();
HtmlHelp *htmlHelp=0;
bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP");
......@@ -926,7 +931,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
!annMemb)
{
ol.startMemberDescription();
ol.parseDoc(briefFile(),briefLine(),cname,this,briefDescription(),FALSE);
ol.parseDoc(briefFile(),briefLine(),osname,this,briefDescription(),FALSE);
if (detailsVisible)
{
ol.pushGeneratorState();
......@@ -1590,8 +1595,8 @@ void MemberDef::warnIfUndocumented()
(prot!=Private || Config_getBool("EXTRACT_PRIVATE"))
)
{
warn_undoc(m_defFileName,m_defLine,"Warning: Member %s of %s %s is not documented.",
name().data(),t,d->name().data());
warn_undoc(m_defFileName,m_defLine,"Warning: Member %s%s of %s %s is not documented.",
name().data(),argsString()?argsString():"",t,d->name().data());
}
}
......
......@@ -442,7 +442,7 @@ void loadStylesheet(const char *name, QDict<StyleData>& dict)
{
QCString s(4096); // string buffer of max line length
s = t.readLine().stripWhiteSpace();
if (s.length()==0 || s.at(0)=='#') continue; // skip blanks & comments
if (s.isEmpty() || s.at(0)=='#') continue; // skip blanks & comments
int sepLength;
int sepStart = separator.match(s,0,&sepLength);
if (sepStart<=0) // no valid assignment statement
......
......@@ -851,11 +851,6 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
<FindMembers>{BN}{1,80} {
lineCount();
}
<FindMembers>{B}*"package"{BN}+ { // Java package
lineCount();
BEGIN(PackageName);
}
<PackageName>{ID}("."{ID})* {
//current->name = yytext;
//current->fileName = yyFileName;
......@@ -1284,6 +1279,11 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
else // insideJava
BEGIN(JavaImport);
}
else if (insideJava && strcmp(yytext,"package")==0)
{
lineCount();
BEGIN(PackageName);
}
else if (insideIDL && strcmp(yytext,"case")==0)
{
BEGIN(IDLUnionCase);
......@@ -1913,7 +1913,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
current = new Entry(*current);
if (current->section==Entry::NAMESPACE_SEC ||
current->section==Entry::INTERFACE_SEC ||
insideJava
insideJava || insidePHP
)
{ // namespaces and interfaces and java classes ends with a closing bracket without semicolon
current->reset();
......
......@@ -101,7 +101,7 @@ class TranslatorGerman : public Translator
{
QCString result="\\usepackage{ngerman}\n";
result+="\\usepackage{t1enc}% Trennung verbessern bei Umlauten\n";
result+="%\\usepackage[latin1]{inputenc}% Kodierung (cp850,latin1,ansinew)";
result+="%\\usepackage[latin1]{inputenc}% Kodierung (cp850,latin1,ansinew)\n";
return result;
}
......
......@@ -669,25 +669,25 @@ class TranslatorEnglish : public Translator
}
virtual QCString trPublicMembers()
{ return "Public Methods"; }
{ return "Public Member Functions"; }
virtual QCString trPublicSlots()
{ return "Public Slots"; }
virtual QCString trSignals()
{ return "Signals"; }
virtual QCString trStaticPublicMembers()
{ return "Static Public Methods"; }
{ return "Static Public Member Functions"; }
virtual QCString trProtectedMembers()
{ return "Protected Methods"; }
{ return "Protected Member Functions"; }
virtual QCString trProtectedSlots()
{ return "Protected Slots"; }
virtual QCString trStaticProtectedMembers()
{ return "Static Protected Methods"; }
{ return "Static Protected Member Functions"; }
virtual QCString trPrivateMembers()
{ return "Private Methods"; }
{ return "Private Member Functions"; }
virtual QCString trPrivateSlots()
{ return "Private Slots"; }
virtual QCString trStaticPrivateMembers()
{ return "Static Private Methods"; }
{ return "Static Private Member Functions"; }
/*! this function is used to produce a comma-separated list of items.
* use generateMarker(i) to indicate where item i should be put.
......@@ -1126,7 +1126,7 @@ class TranslatorEnglish : public Translator
/*! Used as a section header for KDE-2 IDL methods */
virtual QCString trDCOPMethods()
{
return "DCOP Methods";
return "DCOP Member Functions";
}
//////////////////////////////////////////////////////////////////////////
......
......@@ -1414,7 +1414,23 @@ private:
{
return decode( "Spisak zastarelih funkcija èlanica" );
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.18
//////////////////////////////////////////////////////////////////////////
/*! Used as a header for declaration section of the events found in
* a C# program
*/
virtual QCString trEvents()
{
return "Dogaðaji";
}
/*! Header used for the documentation section of a class' events. */
virtual QCString trEventDocumentation()
{
return "Dokumentacija dogaðaja";
}
};
#endif
......
......@@ -317,15 +317,16 @@ QCString generateMarker(int id)
*/
QCString stripFromPath(const QCString &path)
{
const char *s=Config_getList("STRIP_FROM_PATH").first();
QStrList &l = Config_getList("STRIP_FROM_PATH");
const char *s=l.first();
while (s)
{
QCString prefix = s;
if (path.left(prefix.length())==prefix)
if (stricmp(path.left(prefix.length()),prefix)==0) // case insensitive compare
{
return path.right(path.length()-prefix.length());
}
s = Config_getList("STRIP_FROM_PATH").next();
s = l.next();
}
return path;
}
......@@ -1687,11 +1688,11 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA,
return FALSE; // more than a difference in name -> no match
}
}
else // maybe dst has a name while src has not
else // maybe dst has a name while src has not
{
dstPos++;
while (dstPos<dstAType.length() && isId(dstAType.at(dstPos))) dstPos++;
if (dstPos!=dstAType.length())
if (dstPos!=dstAType.length() || !srcA->name.isEmpty())
{
NOMATCH
return FALSE; // nope not a name -> no match
......@@ -1718,13 +1719,17 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA,
{
srcPos++;
while (srcPos<srcAType.length() && isId(srcAType.at(srcPos))) srcPos++;
if (srcPos!=srcAType.length())
if (srcPos!=srcAType.length() || !dstA->name.isEmpty())
{
NOMATCH
return FALSE; // nope not a name -> no match
}
}
}
else
{
printf("something else!\n");
}
}
MATCH
return TRUE;
......@@ -2574,8 +2579,6 @@ bool resolveLink(/* in */ const char *scName,
/* out */ QCString &resAnchor
)
{
//printf("resolveLink clName=`%s' lr=`%s'\n",scName,lr);
*resContext=0;
*resPageInfo=0;
......@@ -2583,6 +2586,8 @@ bool resolveLink(/* in */ const char *scName,
FileDef *fd;
GroupDef *gd;
PageInfo *pi;
ClassDef *cd;
NamespaceDef *nd;
bool ambig;
if (linkRef.isEmpty()) // no reference name!
{
......@@ -2620,7 +2625,17 @@ bool resolveLink(/* in */ const char *scName,
*resContext=fd;
return TRUE;
}
else // probably a class or member reference
else if ((cd=getClass(linkRef)))
{
*resContext=cd;
return TRUE;
}
else if ((nd=Doxygen::namespaceSDict.find(linkRef)))
{
*resContext=nd;
return TRUE;
}
else // probably a member reference
{
MemberDef *md;
bool res = resolveRef(scName,lr,inSeeBlock,resContext,&md);
......
......@@ -58,7 +58,16 @@ inline void writeXMLCodeString(QTextStream &t,const char *s)
char c;
while ((c=*s++))
{
if (c==' ') t << "<sp/>"; else t << c;
switch(c)
{
case ' ': t << "<sp/>"; break;
case '<': t << "&lt;"; break;
case '>': t << "&gt;"; break;
case '&': t << "&amp;"; break;
case '\'': t << "&apos;"; break;
case '"': t << "&quot;"; break;
default: t << c; break;
}
}
}
......@@ -367,7 +376,7 @@ static void writeXMLDocBlock(QTextStream &t,
QCString stext = text.stripWhiteSpace();
if (stext.isEmpty()) return;
// convert the documentation string into an abstract syntax tree
DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,stext,FALSE);
DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,text+"\n",FALSE);
// create a code generator
XMLCodeGenerator *xmlCodeGen = new XMLCodeGenerator(t);
// create a parse tree visitor for XML
......
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