Commit f38608d4 authored by dimitri's avatar dimitri

Release-1.1.3-20000522

parent 8013b5fe
DOXYGEN Version 1.1.3-20000514 DOXYGEN Version 1.1.3-20000522
CONTENTS CONTENTS
-------- --------
...@@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX: ...@@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX:
1. Unpack the archive, unless you already have: 1. Unpack the archive, unless you already have:
gunzip doxygen-1.1.3-20000514.src.tar.gz # uncompress the archive gunzip doxygen-1.1.3-20000522.src.tar.gz # uncompress the archive
tar xf doxygen-1.1.3-20000514.src.tar # unpack it tar xf doxygen-1.1.3-20000522.src.tar # unpack it
2. Run the configure script: 2. Run the configure script:
...@@ -252,4 +252,4 @@ The latest version of doxygen can be obtained at ...@@ -252,4 +252,4 @@ The latest version of doxygen can be obtained at
Enjoy, Enjoy,
Dimitri van Heesch (14 May 2000) Dimitri van Heesch (22 May 2000)
DOXYGEN Version 1.1.3-20000514 DOXYGEN Version 1.1.3-20000522
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at ...@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
Enjoy, Enjoy,
Dimitri van Heesch (14 May 2000) Dimitri van Heesch (22 May 2000)
1.1.3-20000514 1.1.3-20000522
...@@ -40,13 +40,16 @@ void err(const char *fmt, ...) ...@@ -40,13 +40,16 @@ void err(const char *fmt, ...)
vfprintf(stderr, fmt, args); vfprintf(stderr, fmt, args);
va_end(args); va_end(args);
} }
void warn(const char *fmt, ...) void warn_cont(const char *fmt, ...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
vfprintf(stderr, fmt, args); vfprintf(stderr, fmt, args);
va_end(args); va_end(args);
} }
void initWarningFormat()
{
}
#else #else
#include "doxygen.h" #include "doxygen.h"
#include "message.h" #include "message.h"
...@@ -183,7 +186,7 @@ static int yyread(char *buf,int max_size) ...@@ -183,7 +186,7 @@ static int yyread(char *buf,int max_size)
else else
{ {
*b=FALSE; *b=FALSE;
warn("Warning: Invalid value `%s' for " warn_cont("Warning: Invalid value `%s' for "
"boolean tag in line %d; use YES or NO\n", "boolean tag in line %d; use YES or NO\n",
bs.data(),yyLineNr); bs.data(),yyLineNr);
} }
...@@ -248,7 +251,7 @@ static void writeStringList(QTextStream &t,QStrList &l) ...@@ -248,7 +251,7 @@ static void writeStringList(QTextStream &t,QStrList &l)
const char *s=p; const char *s=p;
bool hasBlanks=FALSE; bool hasBlanks=FALSE;
while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t'); while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t');
if (!first) t << " "; if (!first) t << " ";
first=FALSE; first=FALSE;
if (hasBlanks) t << "\"" << s << "\""; else t << s; if (hasBlanks) t << "\"" << s << "\""; else t << s;
p = l.next(); p = l.next();
...@@ -288,7 +291,7 @@ void configStrToVal() ...@@ -288,7 +291,7 @@ void configStrToVal()
int ts = tabSizeString.toInt(&ok); int ts = tabSizeString.toInt(&ok);
if (!ok || ts<1 || ts>16) if (!ok || ts<1 || ts>16)
{ {
warn("Warning: argument of TAB_SIZE is not a valid number, using tab size of 8 spaces!\n"); warn_cont("Warning: argument of TAB_SIZE is not a valid number, using tab size of 8 spaces!\n");
ts=8; ts=8;
} }
Config::tabSize = ts; Config::tabSize = ts;
...@@ -304,7 +307,7 @@ void configStrToVal() ...@@ -304,7 +307,7 @@ void configStrToVal()
int cols = colsInAlphaIndexString.toInt(&ok); int cols = colsInAlphaIndexString.toInt(&ok);
if (!ok || cols<1 || cols>20) if (!ok || cols<1 || cols>20)
{ {
warn("Warning: argument of COLS_IN_ALPHA_INDEX is not a valid number in the range [1..20]!\n" warn_cont("Warning: argument of COLS_IN_ALPHA_INDEX is not a valid number in the range [1..20]!\n"
"Using the default of 5 columns!\n"); "Using the default of 5 columns!\n");
cols = 5; cols = 5;
} }
...@@ -341,7 +344,8 @@ static void substEnvVarsInStrList(QStrList &sl) ...@@ -341,7 +344,8 @@ static void substEnvVarsInStrList(QStrList &sl)
if (!wasQuoted) /* as a result of the expansion, a single string if (!wasQuoted) /* as a result of the expansion, a single string
may have expanded into a list, which we'll may have expanded into a list, which we'll
add to sl. If the orginal string already add to sl. If the orginal string already
contained multiple elements no splitting is done! */ contained multiple elements no further
splitting is done to allow quoted items with spaces! */
{ {
...@@ -354,10 +358,10 @@ static void substEnvVarsInStrList(QStrList &sl) ...@@ -354,10 +358,10 @@ static void substEnvVarsInStrList(QStrList &sl)
{ {
char c; char c;
// skip until start of new word // skip until start of new word
for (;i<l && ((c=result.at(i))==' ' || c=='\t');i++) while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++;
p=i; // p marks the start index of the word p=i; // p marks the start index of the word
// skip until end of a word // skip until end of a word
for (;i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"');i++); while (i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"')) i++;
if (i<l) // not at the end of the string if (i<l) // not at the end of the string
{ {
if (c=='"') // word within quotes if (c=='"') // word within quotes
...@@ -424,6 +428,29 @@ void checkConfig() ...@@ -424,6 +428,29 @@ void checkConfig()
// projectName[0]=toupper(projectName[0]); // projectName[0]=toupper(projectName[0]);
//} //}
if (Config::warnFormat.isEmpty())
{
Config::warnFormat="$file:$line $text";
}
else
{
if (Config::warnFormat.find("$file")==-1)
{
err("Error: warning format does not contain a $file tag!\n");
exit(1);
}
if (Config::warnFormat.find("$line")==-1)
{
err("Error: warning format does not contain a $line tag!\n");
exit(1);
}
if (Config::warnFormat.find("$text")==-1)
{
err("Error: wanring format foes not contain a $text tag!\n");
exit(1);
}
}
initWarningFormat();
// set default man page extension if non is given by the user // set default man page extension if non is given by the user
if (Config::manExtension.isEmpty()) if (Config::manExtension.isEmpty())
...@@ -715,7 +742,7 @@ void checkConfig() ...@@ -715,7 +742,7 @@ void checkConfig()
QFileInfo fi(Config::perlPath); QFileInfo fi(Config::perlPath);
if (!fi.exists()) if (!fi.exists())
{ {
warn("Warning: tag PERL_PATH: perl interpreter not found at default or" warn_cont("Warning: tag PERL_PATH: perl interpreter not found at default or"
"user specified (%s) location\n", "user specified (%s) location\n",
Config::perlPath.data()); Config::perlPath.data());
} }
......
...@@ -775,21 +775,7 @@ void init() ...@@ -775,21 +775,7 @@ void init()
ConfigString::addFixedValue("outputLanguage","Japanese"); ConfigString::addFixedValue("outputLanguage","Japanese");
ConfigString::addFixedValue("outputLanguage","Finnish"); ConfigString::addFixedValue("outputLanguage","Finnish");
ConfigString::addFixedValue("outputLanguage","Spanish"); ConfigString::addFixedValue("outputLanguage","Spanish");
ConfigBool::add( "quietFlag", ConfigString::addFixedValue("outputLanguage","Croatian");
"QUIET",
"FALSE",
"generate progress messages flag",
"The QUIET tag can be used to turn on/off the messages that are generated \n"
"by doxygen. Possible values are YES and NO. If left blank NO is used. \n"
);
ConfigBool::add( "warningFlag",
"WARNINGS",
"TRUE",
"generate warnings flag",
"The WARNINGS tag can be used to turn on/off the warning messages that are \n"
"generated by doxygen. Possible values are YES and NO. If left blank \n"
"NO is used. \n"
);
ConfigBool::add( "noIndexFlag", ConfigBool::add( "noIndexFlag",
"DISABLE_INDEX", "DISABLE_INDEX",
"FALSE", "FALSE",
...@@ -984,6 +970,41 @@ void init() ...@@ -984,6 +970,41 @@ void init()
"documentation sections, marked by \\if sectionname ... \\endif. \n" "documentation sections, marked by \\if sectionname ... \\endif. \n"
); );
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
ConfigInfo::add( "Messages","configuration options related to warning and progress messages");
//-----------------------------------------------------------------------------------------------
ConfigBool::add( "quietFlag",
"QUIET",
"FALSE",
"generate progress messages flag",
"The QUIET tag can be used to turn on/off the messages that are generated \n"
"by doxygen. Possible values are YES and NO. If left blank NO is used. \n"
);
ConfigBool::add( "warningFlag",
"WARNINGS",
"TRUE",
"generate warnings flag",
"The WARNINGS tag can be used to turn on/off the warning messages that are \n"
"generated by doxygen. Possible values are YES and NO. If left blank \n"
"NO is used. \n"
);
ConfigBool::add( "warningUndocFlag",
"WARN_IF_UNDOCUMENTED",
"TRUE",
"generate undocumented warnings",
"If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings \n"
"for undocumented members. If EXTRACT_ALL is set to YES then this flag will \n"
"automatically be disabled. \n"
);
ConfigString::add("warnFormat",
"WARN_FORMAT",
"$file:$line: $text",
"format of the warning messages",
"The WARN_FORMAT tag determines the format of the warning messages that \n"
"doxygen can produce. The string should contain the $file, $line, and $text \n"
"tags, which will be replaced by the file and line number from which the \n"
"warning originated and the warning text. \n"
);
//-----------------------------------------------------------------------------------------------
ConfigInfo::add( "Input","configuration options related to the input files"); ConfigInfo::add( "Input","configuration options related to the input files");
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
ConfigList::add( "inputSources", ConfigList::add( "inputSources",
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
*/ */
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <qmainwindow.h> #include <qmainwindow.h>
#include <qpopupmenu.h> #include <qpopupmenu.h>
#include <qfileinfo.h> #include <qfileinfo.h>
......
...@@ -87,6 +87,7 @@ documentation: ...@@ -87,6 +87,7 @@ documentation:
<li> \refitem cmdmainpage \mainpage <li> \refitem cmdmainpage \mainpage
<li> \refitem cmdname \name <li> \refitem cmdname \name
<li> \refitem cmdnamespace \namespace <li> \refitem cmdnamespace \namespace
<li> \refitem cmdnosubgrouping \nosubgrouping
<li> \refitem cmdoverload \overload <li> \refitem cmdoverload \overload
<li> \refitem cmdpage \page <li> \refitem cmdpage \page
<li> \refitem cmdpar \par <li> \refitem cmdpar \par
...@@ -366,6 +367,14 @@ See section \ref memgroup for an example. ...@@ -366,6 +367,14 @@ See section \ref memgroup for an example.
Indicates that a comment block contains documentation for a Indicates that a comment block contains documentation for a
namespace with name \<name\>. namespace with name \<name\>.
<hr>
\subsection cmdnosubgrouping \nosubgrouping
This command can be put in the documentation
of a class. It can be used in combination with member grouping
to avoid that doxygen puts a member group as a subgroup of a
Public/Protected/Private/... section.
<hr> <hr>
\subsection cmdoverload \overload [(function declaration)] \subsection cmdoverload \overload [(function declaration)]
......
...@@ -147,11 +147,21 @@ QTime and QIODevice classes. ...@@ -147,11 +147,21 @@ QTime and QIODevice classes.
Another reason is for the nice and bug free utility classes, like QList, Another reason is for the nice and bug free utility classes, like QList,
QDict, QString, QArray, QTextStream, QRegExp etc. QDict, QString, QArray, QTextStream, QRegExp etc.
The GUI front-end doxywizard uses Qt for... well... the GUI!
<li><b>Can use doxygen on my Java code?</b> <li><b>Can use doxygen on my Java code?</b>
No, at the moment there is no support for Java. I suggest to No, at the moment there is no support for Java. I suggest to
use Sun's JavaDoc instead. use Sun's JavaDoc instead.
<li><b>How can I exclude all test directories from my directory tree?</b>
Simply put an exclude pattern like this in the configuration file:
\verbatim
EXCLUDE_PATTERNS = */test/*
\endverbatim
</ol> </ol>
\htmlonly \htmlonly
......
...@@ -493,13 +493,16 @@ detailed information about the group. ...@@ -493,13 +493,16 @@ detailed information about the group.
Nesting of member groups is not allowed. Nesting of member groups is not allowed.
If all members of a member group have the same type and protection level If all members of a member group inside a class have the same type
(for instance all are static public members), then the whole member and protection level (for instance all are static public members),
group is displayed as a subgroup of the type/protection level group then the whole member group is displayed as a subgroup of
(the group is displayed as a subsection of the "Static Public Members" the type/protection level group (the group is displayed as a
section for instance). If two or more members have different types, subsection of the "Static Public Members" section for instance).
then the group is put at the same level as the automatically If two or more members have different types, then the group is put
generated groups. at the same level as the automatically generated groups.
If you want to force all member-groups of a class to be at the top level,
you should put a \ref cmdnosubgrouping "\\nosubgrouping" command inside the
documentation of the class.
\par Example: \par Example:
\verbinclude memgrp.cpp \verbinclude memgrp.cpp
......
Name: doxygen Name: doxygen
Version: 1.1.3-20000514 Version: 1.1.3-20000522
Summary: documentation system for C, C++ and IDL Summary: documentation system for C, C++ and IDL
Release: 1 Release: 1
Source0: doxygen-%{version}.src.tar.gz Source0: doxygen-%{version}.src.tar.gz
......
...@@ -42,8 +42,11 @@ static QCString stripExtension(const char *fName) ...@@ -42,8 +42,11 @@ static QCString stripExtension(const char *fName)
} }
// constructs a new class definition // constructs a new class definition
ClassDef::ClassDef(const char *nm,CompoundType ct,const char *ref,const char *fName) ClassDef::ClassDef(
: Definition(removeRedundantWhiteSpace(nm)) const char *defFileName,int defLine,
const char *nm,CompoundType ct,
const char *ref,const char *fName)
: Definition(defFileName,defLine,removeRedundantWhiteSpace(nm))
{ {
//name=n; //name=n;
if (fName) if (fName)
...@@ -83,6 +86,16 @@ ClassDef::ClassDef(const char *nm,CompoundType ct,const char *ref,const char *fN ...@@ -83,6 +86,16 @@ ClassDef::ClassDef(const char *nm,CompoundType ct,const char *ref,const char *fN
memberGroupList = new MemberGroupList; memberGroupList = new MemberGroupList;
memberGroupList->setAutoDelete(TRUE); memberGroupList->setAutoDelete(TRUE);
memberGroupDict = new MemberGroupDict(257); memberGroupDict = new MemberGroupDict(257);
int i=name().findRev("::");
if (i==-1)
{
scopelessName=name();
}
else
{
scopelessName=name().right(name().length()-i-2);
}
subGrouping=TRUE;
} }
// destroy the class definition // destroy the class definition
...@@ -354,12 +367,14 @@ void ClassDef::insertMember(MemberDef *md,int groupId) ...@@ -354,12 +367,14 @@ void ClassDef::insertMember(MemberDef *md,int groupId)
enumValMembers.append(md); enumValMembers.append(md);
break; break;
case MemberDef::Function: case MemberDef::Function:
if (md->name()==name() || // constructor if (md->name()==scopelessName || // constructor
(md->name().find('~')!=-1 && // hack to detect destructor (md->name().find('~')!=-1 && // hack to detect destructor
md->name().find("operator")==-1 md->name().find("operator")==-1
) )
) )
{
constructors.append(md); constructors.append(md);
}
else else
{ {
if (Config::sortMembersFlag) if (Config::sortMembersFlag)
...@@ -454,6 +469,17 @@ void ClassDef::computeAnchors() ...@@ -454,6 +469,17 @@ void ClassDef::computeAnchors()
setAnchors('u',&priTypes); setAnchors('u',&priTypes);
} }
void ClassDef::distributeMemberGroupDocumentation()
{
MemberGroupListIterator mgli(*memberGroupList);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->distributeMemberGroupDocumentation();
}
}
// add a file name to the used files set // add a file name to the used files set
void ClassDef::insertUsedFile(const char *f) void ClassDef::insertUsedFile(const char *f)
{ {
...@@ -524,7 +550,7 @@ void ClassDef::writeDocumentation(OutputList &ol) ...@@ -524,7 +550,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
OutputList briefOutput(&ol); OutputList briefOutput(&ol);
if (!briefDescription().isEmpty()) if (!briefDescription().isEmpty())
{ {
parseDoc(briefOutput,name(),0,briefDescription()); parseDoc(briefOutput,defFileName,defLine,name(),0,briefDescription());
ol+=briefOutput; ol+=briefOutput;
ol.writeString(" \n"); ol.writeString(" \n");
ol.pushGeneratorState(); ol.pushGeneratorState();
...@@ -738,7 +764,7 @@ void ClassDef::writeDocumentation(OutputList &ol) ...@@ -738,7 +764,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
MemberGroup *mg; MemberGroup *mg;
for (;(mg=mgli.current());++mgli) for (;(mg=mgli.current());++mgli)
{ {
if (!mg->allMembersInSameSection()) // group is in its own section if (!mg->allMembersInSameSection() || !subGrouping) // group is in its own section
{ {
mg->writeDeclarations(ol,this,0,0,0); mg->writeDeclarations(ol,this,0,0,0);
} }
...@@ -856,7 +882,7 @@ void ClassDef::writeDocumentation(OutputList &ol) ...@@ -856,7 +882,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
ol.disableAllBut(OutputGenerator::RTF); ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph(); ol.newParagraph();
ol.popGeneratorState(); ol.popGeneratorState();
parseDoc(ol,name(),0,documentation()+"\n"); parseDoc(ol,defFileName,defLine,name(),0,documentation()+"\n");
} }
// write examples // write examples
if (exampleFlag) if (exampleFlag)
...@@ -1149,33 +1175,6 @@ void ClassDef::writeMemberList(OutputList &ol) ...@@ -1149,33 +1175,6 @@ void ClassDef::writeMemberList(OutputList &ol)
ol.popGeneratorState(); ol.popGeneratorState();
} }
//void ClassDef::writeIncludeFile(OutputList &ol)
//{
// initParseCodeContext();
// if (!incFile) return;
// //printf("incFile=%s\n",incFile->absFilePath().data());
// ol.disableAllBut(OutputGenerator::Html);
// startFile(ol,fileName+"-include",name()+" Include File");
// startTitle(ol,0);
// QCString n=incName.copy();
// if (incName.isEmpty())
// {
// n=incFile->name();
// if (Config::fullPathNameFlag)
// {
// n.prepend(stripFromPath(incFile->getPath().copy()));
// }
// }
// parseText(ol,n);
// endTitle(ol,0,0);
// parseText(ol,theTranslator->trVerbatimText(incFile->name()));
// //ol.writeRuler();
// ol.startCodeFragment();
// parseCode(ol,n,fileToString(incFile->absFilePath()),FALSE,0);
// ol.endCodeFragment();
// endFile(ol);
// ol.enableAll();
//}
// add a reference to an example // add a reference to an example
bool ClassDef::addExample(const char *anchor,const char *nameStr, bool ClassDef::addExample(const char *anchor,const char *nameStr,
...@@ -1203,48 +1202,6 @@ bool ClassDef::hasExamples() ...@@ -1203,48 +1202,6 @@ bool ClassDef::hasExamples()
return exampleList->count()>0; return exampleList->count()>0;
} }
#if 0
// write the list of all examples that are used in this class.
void ClassDef::writeExample(OutputList &ol)
{
QCString exampleLine=theTranslator->trWriteList(exampleList->count());
QRegExp marker("@[0-9]+");
int index=0,newIndex,matchLen;
// now replace all markers in inheritLine with links to the classes
while ((newIndex=marker.match(exampleLine,index,&matchLen))!=-1)
{
bool ok;
parseText(ol,exampleLine.mid(index,newIndex-index));
uint entryIndex = exampleLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
Example *e=exampleList->at(entryIndex);
if (ok && e)
{
ol.writeObjectLink(0,e->file,e->anchor,e->name);
}
index=newIndex+matchLen;
}
parseText(ol,exampleLine.right(exampleLine.length()-index));
ol.writeString(".");
#if 0
Example *e=exampleList->first();
while (e)
{
ol.writeObjectLink(0,e->file,e->anchor,e->name);
e=exampleList->next();
if (e)
{
if (exampleList->at()==(int)exampleList->count()-1)
parseText(ol," "+theTranslator->trAnd()+" ");
else
ol.writeString(", ");
}
}
ol.writeString(".");
#endif
}
#endif
void ClassDef::setTemplateArguments(ArgumentList *al) void ClassDef::setTemplateArguments(ArgumentList *al)
{ {
...@@ -1260,33 +1217,6 @@ void ClassDef::setTemplateArguments(ArgumentList *al) ...@@ -1260,33 +1217,6 @@ void ClassDef::setTemplateArguments(ArgumentList *al)
} }
} }
//QCString ClassDef::getTemplateNameString()
//{
// QCString result;
// if (!tempArgs || tempArgs->count()==0) return result;
// result="<";
// Argument *a=tempArgs->first();
// while (a)
// {
// if (!a->name.isEmpty()) // add template argument name
// {
// result+=a->name;
// }
// else // extract name from type
// {
// int i=a->type.length()-1;
// while (i>=0 && isId(a->type.at(i))) i--;
// if (i>0)
// {
// result+=a->type.right(a->type.length()-i-1);
// }
// }
// a=tempArgs->next();
// if (a) result+=", ";
// }
// result+=">";
// return result;
//}
bool ClassDef::hasNonReferenceSuperClass() bool ClassDef::hasNonReferenceSuperClass()
{ {
...@@ -1297,33 +1227,6 @@ bool ClassDef::hasNonReferenceSuperClass() ...@@ -1297,33 +1227,6 @@ bool ClassDef::hasNonReferenceSuperClass()
return found; return found;
} }
//void ClassDef::writeMembersToContents()
//{
// HtmlHelp *htmlHelp = HtmlHelp::getInstance();
//
// htmlHelp->incContentsDepth();
//
// MemberNameInfoListIterator mnili(*allMemberNameInfoList);
// MemberNameInfo *mni;
// for (;(mni=mnili.current());++mnili)
// {
// MemberNameInfoIterator mnii(*mni);
// MemberInfo *mi;
// for (mnii.toLast();(mi=mnii.current());--mnii)
// {
// MemberDef *md=mi->memberDef;
// ClassDef *cd=md->memberClass();
// if (md->isLinkable() && cd==this) // member is not inherited
// {
// htmlHelp->addContentsItem(md->name()+md->argsString(),
// cd->getOutputFileBase(),
// md->anchor());
// }
// }
// }
// htmlHelp->decContentsDepth();
//}
void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup) void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup)
{ {
//ol.insertMemberAlign(); //ol.insertMemberAlign();
......
...@@ -53,7 +53,9 @@ class ClassDef : public Definition ...@@ -53,7 +53,9 @@ class ClassDef : public Definition
Interface=Entry::INTERFACE_SEC, Interface=Entry::INTERFACE_SEC,
Exception=Entry::EXCEPTION_SEC Exception=Entry::EXCEPTION_SEC
}; };
ClassDef(const char *name,CompoundType ct,const char *ref=0,const char *fName=0); ClassDef(const char *fileName,int startLine,
const char *name,CompoundType ct,
const char *ref=0,const char *fName=0);
~ClassDef(); ~ClassDef();
QCString getOutputFileBase() const { return fileName; } QCString getOutputFileBase() const { return fileName; }
CompoundType compoundType() const { return compType; } CompoundType compoundType() const { return compType; }
...@@ -115,8 +117,11 @@ class ClassDef : public Definition ...@@ -115,8 +117,11 @@ class ClassDef : public Definition
{ {
return usesIntfClassDict; return usesIntfClassDict;
} }
void setSubGrouping(bool enabled) { subGrouping = enabled; }
bool visited; bool visited;
void distributeMemberGroupDocumentation();
protected: protected:
void addUsedInterfaceClasses(MemberDef *md,const char *typeStr); void addUsedInterfaceClasses(MemberDef *md,const char *typeStr);
...@@ -126,6 +131,7 @@ class ClassDef : public Definition ...@@ -126,6 +131,7 @@ class ClassDef : public Definition
IncludeInfo *incInfo; // header file to refer to IncludeInfo *incInfo; // header file to refer to
QCString incName; // alternative include file name QCString incName; // alternative include file name
QCString memListFileName; QCString memListFileName;
QCString scopelessName; // name without any scopes
BaseClassList *inherits; BaseClassList *inherits;
BaseClassList *inheritedBy; BaseClassList *inheritedBy;
NamespaceDef *nspace; // the namespace this class is in NamespaceDef *nspace; // the namespace this class is in
...@@ -177,6 +183,10 @@ class ClassDef : public Definition ...@@ -177,6 +183,10 @@ class ClassDef : public Definition
FileDef *fileDef; FileDef *fileDef;
UsesClassDict *usesImplClassDict; UsesClassDict *usesImplClassDict;
UsesClassDict *usesIntfClassDict; UsesClassDict *usesIntfClassDict;
bool subGrouping; // does this class group its user-grouped members
// as a sub-section of the normal (public/protected/..)
// groups?
}; };
struct UsesClassDef struct UsesClassDef
......
...@@ -1002,10 +1002,10 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1002,10 +1002,10 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
<SkipCxxComment>. { <SkipCxxComment>. {
g_code->codify(yytext); g_code->codify(yytext);
} }
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*{B}*"/*"[*!]/[^/*] { <RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*"//@"[{}]{B}*\n)?{B}*"/*"[*!]/[^/*] {
g_yyLineNr+=QCString(yytext).contains('\n'); g_yyLineNr+=QCString(yytext).contains('\n');
} }
<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)* { <RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*"//@"[{}]{B}*\n)? {
g_yyLineNr+=QCString(yytext).contains('\n'); g_yyLineNr+=QCString(yytext).contains('\n');
g_code->endCodeLine(); g_code->endCodeLine();
if (g_yyLineNr<g_inputLines) if (g_yyLineNr<g_inputLines)
...@@ -1046,6 +1046,40 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" ...@@ -1046,6 +1046,40 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
endFontClass(); endFontClass();
} }
} }
<*>\n({B}*"//@"[{}]{B}*\n) { // remove one-line group marker
if (Config::stripCommentsFlag)
{
g_yyLineNr+=((QCString)yytext).contains('\n');
g_code->endCodeLine();
if (g_yyLineNr<g_inputLines)
{
startCodeLine(*g_code);
}
}
else
{
startFontClass("comment");
codifyLines(yytext);
endFontClass();
}
}
<*>^{B}*"//@"[{}]{B}*\n { // remove one-line group marker
if (Config::stripCommentsFlag)
{
g_yyLineNr++;
g_code->endCodeLine();
if (g_yyLineNr<g_inputLines)
{
startCodeLine(*g_code);
}
}
else
{
startFontClass("comment");
codifyLines(yytext);
endFontClass();
}
}
<*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment <*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment
if (Config::stripCommentsFlag) if (Config::stripCommentsFlag)
{ {
......
...@@ -35,8 +35,6 @@ struct Config ...@@ -35,8 +35,6 @@ struct Config
static QCString projectNumber; // the number of the project static QCString projectNumber; // the number of the project
static QCString outputDir; // the global output directory static QCString outputDir; // the global output directory
static QCString outputLanguage; // the output language static QCString outputLanguage; // the output language
static bool quietFlag; // generate progress messages flag
static bool warningFlag; // generate warnings flag
static bool noIndexFlag; // generate condensed index flag static bool noIndexFlag; // generate condensed index flag
static bool extractAllFlag; // gererate docs for all classes flag static bool extractAllFlag; // gererate docs for all classes flag
static bool extractPrivateFlag; // generate docs for private members flag static bool extractPrivateFlag; // generate docs for private members flag
...@@ -61,6 +59,10 @@ struct Config ...@@ -61,6 +59,10 @@ struct Config
static bool sortMembersFlag; // sort members alphabetically? static bool sortMembersFlag; // sort members alphabetically?
static int tabSize; // number of spaces in a tab static int tabSize; // number of spaces in a tab
static QStrList sectionFilterList; // list of section filters that are enabled static QStrList sectionFilterList; // list of section filters that are enabled
static bool quietFlag; // generate progress messages flag
static bool warningFlag; // generate warnings flag
static bool warningUndocFlag; // generate undocumented warnings
static QCString warnFormat; // format of the warning messages
static QStrList inputSources; // list of input files static QStrList inputSources; // list of input files
static QStrList filePatternList; // list of file patterns static QStrList filePatternList; // list of file patterns
static bool recursiveFlag; // scan directories recursively static bool recursiveFlag; // scan directories recursively
......
...@@ -40,7 +40,7 @@ void err(const char *fmt, ...) ...@@ -40,7 +40,7 @@ void err(const char *fmt, ...)
vfprintf(stderr, fmt, args); vfprintf(stderr, fmt, args);
va_end(args); va_end(args);
} }
void warn(const char *fmt, ...) void warn_cont(const char *fmt, ...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
...@@ -67,8 +67,6 @@ QCString Config::projectName; ...@@ -67,8 +67,6 @@ QCString Config::projectName;
QCString Config::projectNumber; QCString Config::projectNumber;
QCString Config::outputDir; QCString Config::outputDir;
QCString Config::outputLanguage = "English"; QCString Config::outputLanguage = "English";
bool Config::quietFlag = FALSE;
bool Config::warningFlag = TRUE;
bool Config::noIndexFlag = FALSE; bool Config::noIndexFlag = FALSE;
bool Config::extractAllFlag = FALSE; bool Config::extractAllFlag = FALSE;
bool Config::extractPrivateFlag = FALSE; bool Config::extractPrivateFlag = FALSE;
...@@ -93,6 +91,10 @@ bool Config::inlineInfoFlag = TRUE; ...@@ -93,6 +91,10 @@ bool Config::inlineInfoFlag = TRUE;
bool Config::sortMembersFlag = TRUE; bool Config::sortMembersFlag = TRUE;
int Config::tabSize = 8; int Config::tabSize = 8;
QStrList Config::sectionFilterList; QStrList Config::sectionFilterList;
bool Config::quietFlag = FALSE;
bool Config::warningFlag = TRUE;
bool Config::warningUndocFlag = TRUE;
QCString Config::warnFormat = "$file:$line: $text";
QStrList Config::inputSources; QStrList Config::inputSources;
QStrList Config::filePatternList; QStrList Config::filePatternList;
bool Config::recursiveFlag = FALSE; bool Config::recursiveFlag = FALSE;
...@@ -205,8 +207,6 @@ static int yyread(char *buf,int max_size) ...@@ -205,8 +207,6 @@ static int yyread(char *buf,int max_size)
<Start>"PROJECT_NUMBER"[ \t]*"=" { BEGIN(GetString); s=&Config::projectNumber; s->resize(0); } <Start>"PROJECT_NUMBER"[ \t]*"=" { BEGIN(GetString); s=&Config::projectNumber; s->resize(0); }
<Start>"OUTPUT_DIRECTORY"[ \t]*"=" { BEGIN(GetString); s=&Config::outputDir; s->resize(0); } <Start>"OUTPUT_DIRECTORY"[ \t]*"=" { BEGIN(GetString); s=&Config::outputDir; s->resize(0); }
<Start>"OUTPUT_LANGUAGE"[ \t]*"=" { BEGIN(GetString); s=&Config::outputLanguage; s->resize(0); } <Start>"OUTPUT_LANGUAGE"[ \t]*"=" { BEGIN(GetString); s=&Config::outputLanguage; s->resize(0); }
<Start>"QUIET"[ \t]*"=" { BEGIN(GetBool); b=&Config::quietFlag; }
<Start>"WARNINGS"[ \t]*"=" { BEGIN(GetBool); b=&Config::warningFlag; }
<Start>"DISABLE_INDEX"[ \t]*"=" { BEGIN(GetBool); b=&Config::noIndexFlag; } <Start>"DISABLE_INDEX"[ \t]*"=" { BEGIN(GetBool); b=&Config::noIndexFlag; }
<Start>"EXTRACT_ALL"[ \t]*"=" { BEGIN(GetBool); b=&Config::extractAllFlag; } <Start>"EXTRACT_ALL"[ \t]*"=" { BEGIN(GetBool); b=&Config::extractAllFlag; }
<Start>"EXTRACT_PRIVATE"[ \t]*"=" { BEGIN(GetBool); b=&Config::extractPrivateFlag; } <Start>"EXTRACT_PRIVATE"[ \t]*"=" { BEGIN(GetBool); b=&Config::extractPrivateFlag; }
...@@ -231,6 +231,10 @@ static int yyread(char *buf,int max_size) ...@@ -231,6 +231,10 @@ static int yyread(char *buf,int max_size)
<Start>"SORT_MEMBER_DOCS"[ \t]*"=" { BEGIN(GetBool); b=&Config::sortMembersFlag; } <Start>"SORT_MEMBER_DOCS"[ \t]*"=" { BEGIN(GetBool); b=&Config::sortMembersFlag; }
<Start>"TAB_SIZE"[ \t]*"=" { BEGIN(GetString); s=&tabSizeString; s->resize(0); } <Start>"TAB_SIZE"[ \t]*"=" { BEGIN(GetString); s=&tabSizeString; s->resize(0); }
<Start>"ENABLED_SECTIONS"[ \t]*"=" { BEGIN(GetStrList); l=&Config::sectionFilterList; l->clear(); elemStr=""; } <Start>"ENABLED_SECTIONS"[ \t]*"=" { BEGIN(GetStrList); l=&Config::sectionFilterList; l->clear(); elemStr=""; }
<Start>"QUIET"[ \t]*"=" { BEGIN(GetBool); b=&Config::quietFlag; }
<Start>"WARNINGS"[ \t]*"=" { BEGIN(GetBool); b=&Config::warningFlag; }
<Start>"WARN_IF_UNDOCUMENTED"[ \t]*"=" { BEGIN(GetBool); b=&Config::warningUndocFlag; }
<Start>"WARN_FORMAT"[ \t]*"=" { BEGIN(GetString); s=&Config::warnFormat; s->resize(0); }
<Start>"INPUT"[ \t]*"=" { BEGIN(GetStrList); l=&Config::inputSources; l->clear(); elemStr=""; } <Start>"INPUT"[ \t]*"=" { BEGIN(GetStrList); l=&Config::inputSources; l->clear(); elemStr=""; }
<Start>"FILE_PATTERNS"[ \t]*"=" { BEGIN(GetStrList); l=&Config::filePatternList; l->clear(); elemStr=""; } <Start>"FILE_PATTERNS"[ \t]*"=" { BEGIN(GetStrList); l=&Config::filePatternList; l->clear(); elemStr=""; }
<Start>"RECURSIVE"[ \t]*"=" { BEGIN(GetBool); b=&Config::recursiveFlag; } <Start>"RECURSIVE"[ \t]*"=" { BEGIN(GetBool); b=&Config::recursiveFlag; }
...@@ -354,7 +358,7 @@ static int yyread(char *buf,int max_size) ...@@ -354,7 +358,7 @@ static int yyread(char *buf,int max_size)
else else
{ {
*b=FALSE; *b=FALSE;
warn("Warning: Invalid value `%s' for " warn_cont("Warning: Invalid value `%s' for "
"boolean tag in line %d; use YES or NO\n", "boolean tag in line %d; use YES or NO\n",
bs.data(),yyLineNr); bs.data(),yyLineNr);
} }
...@@ -381,8 +385,6 @@ void dumpConfig() ...@@ -381,8 +385,6 @@ void dumpConfig()
printf("projectNumber=`%s'\n",Config::projectNumber.data()); printf("projectNumber=`%s'\n",Config::projectNumber.data());
printf("outputDir=`%s'\n",Config::outputDir.data()); printf("outputDir=`%s'\n",Config::outputDir.data());
printf("outputLanguage=`%s'\n",Config::outputLanguage.data()); printf("outputLanguage=`%s'\n",Config::outputLanguage.data());
printf("quietFlag=`%d'\n",Config::quietFlag);
printf("warningFlag=`%d'\n",Config::warningFlag);
printf("noIndexFlag=`%d'\n",Config::noIndexFlag); printf("noIndexFlag=`%d'\n",Config::noIndexFlag);
printf("extractAllFlag=`%d'\n",Config::extractAllFlag); printf("extractAllFlag=`%d'\n",Config::extractAllFlag);
printf("extractPrivateFlag=`%d'\n",Config::extractPrivateFlag); printf("extractPrivateFlag=`%d'\n",Config::extractPrivateFlag);
...@@ -421,6 +423,11 @@ void dumpConfig() ...@@ -421,6 +423,11 @@ void dumpConfig()
is=Config::sectionFilterList.next(); is=Config::sectionFilterList.next();
} }
} }
printf("# configuration options related to warning and progress messages\n");
printf("quietFlag=`%d'\n",Config::quietFlag);
printf("warningFlag=`%d'\n",Config::warningFlag);
printf("warningUndocFlag=`%d'\n",Config::warningUndocFlag);
printf("warnFormat=`%s'\n",Config::warnFormat.data());
printf("# configuration options related to the input files\n"); printf("# configuration options related to the input files\n");
{ {
char *is=Config::inputSources.first(); char *is=Config::inputSources.first();
...@@ -586,8 +593,6 @@ void Config::init() ...@@ -586,8 +593,6 @@ void Config::init()
Config::projectNumber.resize(0); Config::projectNumber.resize(0);
Config::outputDir.resize(0); Config::outputDir.resize(0);
Config::outputLanguage = "English"; Config::outputLanguage = "English";
Config::quietFlag = FALSE;
Config::warningFlag = TRUE;
Config::noIndexFlag = FALSE; Config::noIndexFlag = FALSE;
Config::extractAllFlag = FALSE; Config::extractAllFlag = FALSE;
Config::extractPrivateFlag = FALSE; Config::extractPrivateFlag = FALSE;
...@@ -612,6 +617,10 @@ void Config::init() ...@@ -612,6 +617,10 @@ void Config::init()
Config::sortMembersFlag = TRUE; Config::sortMembersFlag = TRUE;
Config::tabSize = 8; Config::tabSize = 8;
Config::sectionFilterList.clear(); Config::sectionFilterList.clear();
Config::quietFlag = FALSE;
Config::warningFlag = TRUE;
Config::warningUndocFlag = TRUE;
Config::warnFormat = "$file:$line: $text";
Config::inputSources.clear(); Config::inputSources.clear();
Config::filePatternList.clear(); Config::filePatternList.clear();
Config::recursiveFlag = FALSE; Config::recursiveFlag = FALSE;
...@@ -705,7 +714,7 @@ static void writeStringList(QTextStream &t,QStrList &l) ...@@ -705,7 +714,7 @@ static void writeStringList(QTextStream &t,QStrList &l)
const char *s=p; const char *s=p;
bool hasBlanks=FALSE; bool hasBlanks=FALSE;
while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t'); while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t');
if (!first) t << " "; if (!first) t << " ";
first=FALSE; first=FALSE;
if (hasBlanks) t << "\"" << s << "\""; else t << s; if (hasBlanks) t << "\"" << s << "\""; else t << s;
p = l.next(); p = l.next();
...@@ -785,27 +794,6 @@ void writeTemplateConfig(QFile *f,bool sl) ...@@ -785,27 +794,6 @@ void writeTemplateConfig(QFile *f,bool sl)
writeStringValue(t,Config::outputLanguage); writeStringValue(t,Config::outputLanguage);
t << "\n"; t << "\n";
if (!sl) if (!sl)
{
t << "\n";
t << "# The QUIET tag can be used to turn on/off the messages that are generated \n";
t << "# by doxygen. Possible values are YES and NO. If left blank NO is used. \n";
t << "\n";
}
t << "QUIET = ";
writeBoolValue(t,Config::quietFlag);
t << "\n";
if (!sl)
{
t << "\n";
t << "# The WARNINGS tag can be used to turn on/off the warning messages that are \n";
t << "# generated by doxygen. Possible values are YES and NO. If left blank \n";
t << "# NO is used. \n";
t << "\n";
}
t << "WARNINGS = ";
writeBoolValue(t,Config::warningFlag);
t << "\n";
if (!sl)
{ {
t << "\n"; t << "\n";
t << "# The DISABLE_INDEX tag can be used to turn on/off the condensed index at \n"; t << "# The DISABLE_INDEX tag can be used to turn on/off the condensed index at \n";
...@@ -1073,6 +1061,57 @@ void writeTemplateConfig(QFile *f,bool sl) ...@@ -1073,6 +1061,57 @@ void writeTemplateConfig(QFile *f,bool sl)
t << "\n"; t << "\n";
} }
t << "#---------------------------------------------------------------------------\n"; t << "#---------------------------------------------------------------------------\n";
t << "# configuration options related to warning and progress messages\n";
t << "#---------------------------------------------------------------------------\n";
if (!sl)
{
t << "\n";
t << "# The QUIET tag can be used to turn on/off the messages that are generated \n";
t << "# by doxygen. Possible values are YES and NO. If left blank NO is used. \n";
t << "\n";
}
t << "QUIET = ";
writeBoolValue(t,Config::quietFlag);
t << "\n";
if (!sl)
{
t << "\n";
t << "# The WARNINGS tag can be used to turn on/off the warning messages that are \n";
t << "# generated by doxygen. Possible values are YES and NO. If left blank \n";
t << "# NO is used. \n";
t << "\n";
}
t << "WARNINGS = ";
writeBoolValue(t,Config::warningFlag);
t << "\n";
if (!sl)
{
t << "\n";
t << "# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings \n";
t << "# for undocumented members. If EXTRACT_ALL is set to YES then this flag will \n";
t << "# automatically be disabled. \n";
t << "\n";
}
t << "WARN_IF_UNDOCUMENTED = ";
writeBoolValue(t,Config::warningUndocFlag);
t << "\n";
if (!sl)
{
t << "\n";
t << "# The WARN_FORMAT tag determines the format of the warning messages that \n";
t << "# doxygen can produce. The string should contain the $file, $line, and $text \n";
t << "# tags, which will be replaced by the file and line number from which the \n";
t << "# warning originated and the warning text. \n";
t << "\n";
}
t << "WARN_FORMAT = ";
writeStringValue(t,Config::warnFormat);
t << "\n";
if (!sl)
{
t << "\n";
}
t << "#---------------------------------------------------------------------------\n";
t << "# configuration options related to the input files\n"; t << "# configuration options related to the input files\n";
t << "#---------------------------------------------------------------------------\n"; t << "#---------------------------------------------------------------------------\n";
if (!sl) if (!sl)
...@@ -1777,7 +1816,7 @@ void configStrToVal() ...@@ -1777,7 +1816,7 @@ void configStrToVal()
int ts = tabSizeString.toInt(&ok); int ts = tabSizeString.toInt(&ok);
if (!ok || ts<1 || ts>16) if (!ok || ts<1 || ts>16)
{ {
warn("Warning: argument of TAB_SIZE is not a valid number, using tab size of 8 spaces!\n"); warn_cont("Warning: argument of TAB_SIZE is not a valid number, using tab size of 8 spaces!\n");
ts=8; ts=8;
} }
Config::tabSize = ts; Config::tabSize = ts;
...@@ -1793,7 +1832,7 @@ void configStrToVal() ...@@ -1793,7 +1832,7 @@ void configStrToVal()
int cols = colsInAlphaIndexString.toInt(&ok); int cols = colsInAlphaIndexString.toInt(&ok);
if (!ok || cols<1 || cols>20) if (!ok || cols<1 || cols>20)
{ {
warn("Warning: argument of COLS_IN_ALPHA_INDEX is not a valid number in the range [1..20]!\n" warn_cont("Warning: argument of COLS_IN_ALPHA_INDEX is not a valid number in the range [1..20]!\n"
"Using the default of 5 columns!\n"); "Using the default of 5 columns!\n");
cols = 5; cols = 5;
} }
...@@ -1830,7 +1869,8 @@ static void substEnvVarsInStrList(QStrList &sl) ...@@ -1830,7 +1869,8 @@ static void substEnvVarsInStrList(QStrList &sl)
if (!wasQuoted) /* as a result of the expansion, a single string if (!wasQuoted) /* as a result of the expansion, a single string
may have expanded into a list, which we'll may have expanded into a list, which we'll
add to sl. If the orginal string already add to sl. If the orginal string already
contained multiple elements no splitting is done! */ contained multiple elements no further
splitting is done to allow quoted items with spaces! */
{ {
...@@ -1843,10 +1883,10 @@ static void substEnvVarsInStrList(QStrList &sl) ...@@ -1843,10 +1883,10 @@ static void substEnvVarsInStrList(QStrList &sl)
{ {
char c; char c;
// skip until start of new word // skip until start of new word
for (;i<l && ((c=result.at(i))==' ' || c=='\t');i++) while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++;
p=i; // p marks the start index of the word p=i; // p marks the start index of the word
// skip until end of a word // skip until end of a word
for (;i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"');i++); while (i<l && ((c=result.at(i))!=' ' && c!='\t' && c!='"')) i++;
if (i<l) // not at the end of the string if (i<l) // not at the end of the string
{ {
if (c=='"') // word within quotes if (c=='"') // word within quotes
...@@ -1909,6 +1949,7 @@ void substituteEnvironmentVars() ...@@ -1909,6 +1949,7 @@ void substituteEnvironmentVars()
substEnvVarsInString( Config::outputLanguage ); substEnvVarsInString( Config::outputLanguage );
substEnvVarsInStrList( Config::stripFromPath ); substEnvVarsInStrList( Config::stripFromPath );
substEnvVarsInStrList( Config::sectionFilterList ); substEnvVarsInStrList( Config::sectionFilterList );
substEnvVarsInString( Config::warnFormat );
substEnvVarsInStrList( Config::inputSources ); substEnvVarsInStrList( Config::inputSources );
substEnvVarsInStrList( Config::filePatternList ); substEnvVarsInStrList( Config::filePatternList );
substEnvVarsInStrList( Config::excludeSources ); substEnvVarsInStrList( Config::excludeSources );
...@@ -1949,6 +1990,29 @@ void checkConfig() ...@@ -1949,6 +1990,29 @@ void checkConfig()
// projectName[0]=toupper(projectName[0]); // projectName[0]=toupper(projectName[0]);
//} //}
if (Config::warnFormat.isEmpty())
{
Config::warnFormat="$file:$line $text";
}
else
{
if (Config::warnFormat.find("$file")==-1)
{
err("Error: warning format does not contain a $file tag!\n");
exit(1);
}
if (Config::warnFormat.find("$line")==-1)
{
err("Error: warning format does not contain a $line tag!\n");
exit(1);
}
if (Config::warnFormat.find("$text")==-1)
{
err("Error: wanring format foes not contain a $text tag!\n");
exit(1);
}
}
initWarningFormat();
// set default man page extension if non is given by the user // set default man page extension if non is given by the user
if (Config::manExtension.isEmpty()) if (Config::manExtension.isEmpty())
...@@ -2240,7 +2304,7 @@ void checkConfig() ...@@ -2240,7 +2304,7 @@ void checkConfig()
QFileInfo fi(Config::perlPath); QFileInfo fi(Config::perlPath);
if (!fi.exists()) if (!fi.exists())
{ {
warn("Warning: tag PERL_PATH: perl interpreter not found at default or" warn_cont("Warning: tag PERL_PATH: perl interpreter not found at default or"
"user specified (%s) location\n", "user specified (%s) location\n",
Config::perlPath.data()); Config::perlPath.data());
} }
......
...@@ -25,9 +25,17 @@ ...@@ -25,9 +25,17 @@
#include "outputlist.h" #include "outputlist.h"
#include "scanner.h" #include "scanner.h"
Definition::Definition(const char *name,const char *b,const char *d) Definition::Definition(const char *df,int dl,
const char *name,const char *b,const char *d)
{ {
n=name; brief=b; doc=d; sectionList=0, startBodyLine=endBodyLine=-1, bodyDef=0; defFileName = df;
defLine = dl;
n=name;
brief=b;
doc=d;
sectionList=0,
startBodyLine=endBodyLine=-1,
bodyDef=0;
} }
Definition::~Definition() Definition::~Definition()
......
...@@ -25,12 +25,14 @@ class FileDef; ...@@ -25,12 +25,14 @@ class FileDef;
class OutputList; class OutputList;
class SectionList; class SectionList;
/*! The common base class of all definitions. */ /*! The common base class of all entity definitions found in the sources. */
class Definition class Definition
{ {
public: public:
/*! create a new definition */ /*! create a new definition */
Definition(const char *name,const char *b=0,const char *d=0); Definition(
const char *defFileName,int defLine,
const char *name,const char *b=0,const char *d=0);
/*! destroys the definition */ /*! destroys the definition */
virtual ~Definition(); virtual ~Definition();
/*! returns the name of the definition */ /*! returns the name of the definition */
...@@ -92,17 +94,27 @@ class Definition ...@@ -92,17 +94,27 @@ class Definition
FileDef *getBodyDef() { return bodyDef; } FileDef *getBodyDef() { return bodyDef; }
void writeSourceRef(OutputList &ol,const char *scopeName); void writeSourceRef(OutputList &ol,const char *scopeName);
/*! returns the file in which this definition was found */
QCString getDefFileName() const { return defFileName; }
/*! returns the line number at which the definition was found */
int getDefLine() const { return defLine; }
protected: protected:
int startBodyLine; // line number of the start of the definition int startBodyLine; // line number of the start of the definition
int endBodyLine; // line number of the end of the definition int endBodyLine; // line number of the end of the definition
FileDef *bodyDef; // file definition containing the function body FileDef *bodyDef; // file definition containing the function body
// where the item was found
QCString defFileName;
int defLine;
private: private:
QCString n; // name of the definition QCString n; // name of the definition
QCString brief; // brief description QCString brief; // brief description
QCString doc; // detailed description QCString doc; // detailed description
QCString ref; // reference to external documentation QCString ref; // reference to external documentation
SectionList *sectionList; // list of all sections SectionList *sectionList; // list of all sections
}; };
#endif #endif
...@@ -183,13 +183,14 @@ void buildGroupList(Entry *root) ...@@ -183,13 +183,14 @@ void buildGroupList(Entry *root)
if ((gd=groupDict[root->name])) if ((gd=groupDict[root->name]))
{ {
warn("Warning: group %s already documented\n" warn(root->fileName,root->startLine,
" skipping documentation in file %s at line %d\n", "Warning: group %s already documented. "
root->name.data(),root->fileName.data(),root->startLine); "Skipping documentation.",
root->name.data());
} }
else else
{ {
gd = new GroupDef(root->name,root->type); gd = new GroupDef(root->fileName,root->startLine,root->name,root->type);
gd->setBriefDescription(root->brief); gd->setBriefDescription(root->brief);
gd->setDocumentation(root->doc); gd->setDocumentation(root->doc);
gd->addSectionsToDefinition(root->anchors); gd->addSectionsToDefinition(root->anchors);
...@@ -253,9 +254,12 @@ void buildFileList(Entry *root) ...@@ -253,9 +254,12 @@ void buildFileList(Entry *root)
if ((!root->doc.isEmpty() && !fd->documentation().isEmpty()) || if ((!root->doc.isEmpty() && !fd->documentation().isEmpty()) ||
(!root->brief.isEmpty() && !fd->briefDescription().isEmpty())) (!root->brief.isEmpty() && !fd->briefDescription().isEmpty()))
{ {
warn("Warning: file %s already documented\n" warn(
" skipping documentation in file %s at line %d\n", root->fileName,root->startLine,
root->name.data(),root->fileName.data(),root->startLine); "Warning: file %s already documented. "
"Skipping documentation.",
root->name.data()
);
} }
else else
{ {
...@@ -281,21 +285,23 @@ void buildFileList(Entry *root) ...@@ -281,21 +285,23 @@ void buildFileList(Entry *root)
else else
{ {
const char *fn = root->fileName.data(); const char *fn = root->fileName.data();
warn("Warning: the name `%s' supplied as " QCString text;
"the second argument in the \\file statement in file " text.sprintf("Warning: the name `%s' supplied as "
"%s at line %d ", "the second argument in the \\file statement.",
root->name.data(), root->name.data()
fn ? fn : "???", );
root->startLine);
if (ambig) // name is ambigious if (ambig) // name is ambigious
{ {
warn("matches the following input files:\n"); text+="matches the following input files:\n";
showFileDefMatches(&inputNameDict,root->name); text+=showFileDefMatches(&inputNameDict,root->name);
warn("Please use a more specific name by " text+="Please use a more specific name by "
"including a (larger) part of the path!\n"); "including a (larger) part of the path!";
} }
else // name is not an input file else // name is not an input file
warn("is not an input file\n"); {
text+="is not an input file";
}
warn(fn,root->startLine,text);
} }
} }
EntryListIterator eli(*root->sublist); EntryListIterator eli(*root->sublist);
...@@ -325,21 +331,23 @@ static void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root) ...@@ -325,21 +331,23 @@ static void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
(fd=findFileDef(&inputNameDict,root->includeFile,ambig))==0 (fd=findFileDef(&inputNameDict,root->includeFile,ambig))==0
) )
{ // explicit request { // explicit request
warn("Warning: the name `%s' supplied as " QCString text;
"the second argument in the \\class statement in file " text.sprintf("Warning: the name `%s' supplied as "
"%s at line %d ", "the second argument in the \\class statement.",
root->includeFile.data(), root->includeFile.data()
root->fileName.data(), );
root->startLine);
if (ambig) // name is ambigious if (ambig) // name is ambigious
{ {
warn("matches the following input files:\n"); text+="matches the following input files:\n";
showFileDefMatches(&inputNameDict,root->includeFile); text+=showFileDefMatches(&inputNameDict,root->includeFile);
warn("Please use a more specific name by " text+="Please use a more specific name by "
"including a (larger) part of the path!\n"); "including a (larger) part of the path!";
} }
else // name is not an input file else // name is not an input file
warn("is not an input file\n"); {
text+="is not an input file";
}
warn(root->fileName,root->startLine,text);
} }
else if (root->includeFile.isEmpty() && ifd && else if (root->includeFile.isEmpty() && ifd &&
// see if the file extension makes sense // see if the file extension makes sense
...@@ -424,8 +432,9 @@ void buildClassList(Entry *root) ...@@ -424,8 +432,9 @@ void buildClassList(Entry *root)
if (fullName.isEmpty()) if (fullName.isEmpty())
{ {
// this should not be called // this should not be called
warn("Warning: invalid class found in file %s at %d\n", warn(root->fileName,root->startLine,
root->fileName.data(),root->startLine); "Warning: invalid class name found!"
);
} }
else else
{ {
...@@ -452,9 +461,12 @@ void buildClassList(Entry *root) ...@@ -452,9 +461,12 @@ void buildClassList(Entry *root)
{ {
if (!root->doc.isEmpty() && !cd->documentation().isEmpty()) if (!root->doc.isEmpty() && !cd->documentation().isEmpty())
{ {
warn("Warning: class %s already has a detailed description\n" warn(
" skipping the one in file %s at line %d\n", root->fileName,root->startLine,
fullName.data(),root->fileName.data(),root->startLine); "Warning: class %s already has a detailed description. "
"Skipping the one found here.",
fullName.data()
);
} }
else if (!root->doc.isEmpty()) else if (!root->doc.isEmpty())
{ {
...@@ -462,9 +474,12 @@ void buildClassList(Entry *root) ...@@ -462,9 +474,12 @@ void buildClassList(Entry *root)
} }
if (!root->brief.isEmpty() && !cd->briefDescription().isEmpty()) if (!root->brief.isEmpty() && !cd->briefDescription().isEmpty())
{ {
warn("Warning: class %s already has a brief description\n" warn(
" skipping the one in file %s at line %d\n", root->fileName,root->startLine,
fullName.data(),root->fileName.data(),root->startLine); "Warning: class %s already has a brief description\n"
" skipping the one found here.",
fullName.data()
);
} }
else if (!root->brief.isEmpty()) else if (!root->brief.isEmpty())
{ {
...@@ -494,6 +509,7 @@ void buildClassList(Entry *root) ...@@ -494,6 +509,7 @@ void buildClassList(Entry *root)
fd->insertClass(cd); fd->insertClass(cd);
} }
addClassToGroups(root,cd); addClassToGroups(root,cd);
if (!root->subGrouping) cd->setSubGrouping(FALSE);
} }
else // new class else // new class
{ {
...@@ -520,7 +536,7 @@ void buildClassList(Entry *root) ...@@ -520,7 +536,7 @@ void buildClassList(Entry *root)
//printf("New class: namespace `%s' name=`%s'\n",className.data(),namespaceName.data()); //printf("New class: namespace `%s' name=`%s'\n",className.data(),namespaceName.data());
ClassDef *cd=new ClassDef(fullName,sec); ClassDef *cd=new ClassDef(root->fileName,root->startLine,fullName,sec);
cd->setDocumentation(root->doc); // copy docs to definition cd->setDocumentation(root->doc); // copy docs to definition
cd->setBriefDescription(root->brief); cd->setBriefDescription(root->brief);
//printf("new ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data()); //printf("new ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data());
...@@ -530,6 +546,7 @@ void buildClassList(Entry *root) ...@@ -530,6 +546,7 @@ void buildClassList(Entry *root)
// file definition containing the class cd // file definition containing the class cd
cd->setBodySegment(root->bodyLine,root->endBodyLine); cd->setBodySegment(root->bodyLine,root->endBodyLine);
cd->setBodyDef(fd); cd->setBodyDef(fd);
if (!root->subGrouping) cd->setSubGrouping(FALSE);
addClassToGroups(root,cd); addClassToGroups(root,cd);
...@@ -614,9 +631,11 @@ void buildNamespaceList(Entry *root) ...@@ -614,9 +631,11 @@ void buildNamespaceList(Entry *root)
} }
else if (!nd->documentation().isEmpty() && !root->doc.isEmpty()) else if (!nd->documentation().isEmpty() && !root->doc.isEmpty())
{ {
warn("Warning: namespace %s already has a detailed description,\n" warn(
" skipping documentation in file %s at line %d\n", root->fileName,root->startLine,
fullName.data(),root->fileName.data(),root->startLine); "Warning: namespace %s already has a detailed description. "
"Skipping the documentation found here.",
fullName.data());
} }
if (nd->briefDescription().isEmpty() && !root->brief.isEmpty()) if (nd->briefDescription().isEmpty() && !root->brief.isEmpty())
{ {
...@@ -625,9 +644,11 @@ void buildNamespaceList(Entry *root) ...@@ -625,9 +644,11 @@ void buildNamespaceList(Entry *root)
} }
else if (!nd->briefDescription().isEmpty() && !root->brief.isEmpty()) else if (!nd->briefDescription().isEmpty() && !root->brief.isEmpty())
{ {
warn("Warning: namespace %s already has a brief description,\n" warn(root->fileName,root->startLine,
" skipping documentation in file %s at line %d\n", "Warning: namespace %s already has a brief description. "
fullName.data(),root->fileName.data(),root->startLine); "Skipping the documentation found here.",
fullName.data()
);
} }
} }
...@@ -643,7 +664,7 @@ void buildNamespaceList(Entry *root) ...@@ -643,7 +664,7 @@ void buildNamespaceList(Entry *root)
) )
*/ */
{ {
NamespaceDef *nd=new NamespaceDef(fullName); NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,fullName);
nd->setDocumentation(root->doc); // copy docs to definition nd->setDocumentation(root->doc); // copy docs to definition
nd->setBriefDescription(root->brief); nd->setBriefDescription(root->brief);
nd->addSectionsToDefinition(root->anchors); nd->addSectionsToDefinition(root->anchors);
...@@ -739,7 +760,8 @@ void findUsingDirectives(Entry *root) ...@@ -739,7 +760,8 @@ void findUsingDirectives(Entry *root)
} }
else // unknown namespace, but add it anyway. else // unknown namespace, but add it anyway.
{ {
NamespaceDef *nd=new NamespaceDef(root->name); NamespaceDef *nd=new NamespaceDef(
root->fileName,root->startLine,root->name);
nd->setDocumentation(root->doc); // copy docs to definition nd->setDocumentation(root->doc); // copy docs to definition
nd->setBriefDescription(root->brief); nd->setBriefDescription(root->brief);
nd->addSectionsToDefinition(root->anchors); nd->addSectionsToDefinition(root->anchors);
...@@ -846,12 +868,14 @@ static MemberDef *addVariableToClass( ...@@ -846,12 +868,14 @@ static MemberDef *addVariableToClass(
} }
} }
// new member variable, typedef or enum value // new member variable, typedef or enum value
MemberDef *md=new MemberDef(root->type,name,root->args,0, MemberDef *md=new MemberDef(
root->fileName,root->startLine,
root->type,name,root->args,0,
prot,Normal,root->stat,FALSE, prot,Normal,root->stat,FALSE,
mtype,0,0); mtype,0,0);
md->setMemberClass(cd); md->setMemberClass(cd);
md->setDefFile(root->fileName); //md->setDefFile(root->fileName);
md->setDefLine(root->startLine); //md->setDefLine(root->startLine);
md->setDocumentation(root->doc); md->setDocumentation(root->doc);
md->setBriefDescription(root->brief); md->setBriefDescription(root->brief);
md->setDefinition(def); md->setDefinition(def);
...@@ -912,11 +936,13 @@ static MemberDef *addVariableToFile( ...@@ -912,11 +936,13 @@ static MemberDef *addVariableToFile(
); );
// new global variable, enum value or typedef // new global variable, enum value or typedef
MemberDef *md=new MemberDef(root->type,name,root->args,0, MemberDef *md=new MemberDef(
root->fileName,root->startLine,
root->type,name,root->args,0,
Public, Normal,root->stat,FALSE, Public, Normal,root->stat,FALSE,
mtype,0,0); mtype,0,0);
md->setDefFile(root->fileName); //md->setDefFile(root->fileName);
md->setDefLine(root->startLine); //md->setDefLine(root->startLine);
md->setDocumentation(root->doc); md->setDocumentation(root->doc);
md->setBriefDescription(root->brief); md->setBriefDescription(root->brief);
md->addSectionsToDefinition(root->anchors); md->addSectionsToDefinition(root->anchors);
...@@ -1260,12 +1286,14 @@ void buildMemberList(Entry *root) ...@@ -1260,12 +1286,14 @@ void buildMemberList(Entry *root)
// new member function, signal or slot. // new member function, signal or slot.
//printf("new member: %s class template args=`%s'\n", //printf("new member: %s class template args=`%s'\n",
// root->args.data(),argListToString(cd->templateArguments()).data()); // root->args.data(),argListToString(cd->templateArguments()).data());
MemberDef *md=new MemberDef(root->type,name,root->args,root->exception, MemberDef *md=new MemberDef(
root->protection,root->virt,root->stat,!root->relates.isEmpty(), root->fileName,root->startLine,
mtype,root->mtArgList,root->argList); root->type,name,root->args,root->exception,
root->protection,root->virt,root->stat,!root->relates.isEmpty(),
mtype,root->mtArgList,root->argList);
md->setMemberClass(cd); md->setMemberClass(cd);
md->setDefFile(root->fileName); //md->setDefFile(root->fileName);
md->setDefLine(root->startLine); //md->setDefLine(root->startLine);
md->setDocumentation(root->doc); md->setDocumentation(root->doc);
md->setBriefDescription(root->brief); md->setBriefDescription(root->brief);
md->setBodySegment(root->bodyLine,root->endBodyLine); md->setBodySegment(root->bodyLine,root->endBodyLine);
...@@ -1425,11 +1453,13 @@ void buildMemberList(Entry *root) ...@@ -1425,11 +1453,13 @@ void buildMemberList(Entry *root)
// new global function // new global function
QCString name=removeRedundantWhiteSpace(root->name); QCString name=removeRedundantWhiteSpace(root->name);
MemberDef *md=new MemberDef(root->type,name,root->args,root->exception, MemberDef *md=new MemberDef(
root->fileName,root->startLine,
root->type,name,root->args,root->exception,
root->protection,root->virt,root->stat,FALSE, root->protection,root->virt,root->stat,FALSE,
MemberDef::Function,root->tArgList,root->argList); MemberDef::Function,root->tArgList,root->argList);
md->setDefFile(root->fileName); //md->setDefFile(root->fileName);
md->setDefLine(root->startLine); //md->setDefLine(root->startLine);
md->setDocumentation(root->doc); md->setDocumentation(root->doc);
md->setBriefDescription(root->brief); md->setBriefDescription(root->brief);
md->setPrototype(root->proto); md->setPrototype(root->proto);
...@@ -1538,8 +1568,9 @@ void buildMemberList(Entry *root) ...@@ -1538,8 +1568,9 @@ void buildMemberList(Entry *root)
} }
else if (root->name.isEmpty()) else if (root->name.isEmpty())
{ {
warn("Warning: Illegal member name found in file %s at line %d\n", warn(root->fileName,root->startLine,
root->fileName.data(),root->startLine); "Warning: Illegal member name found."
);
} }
} }
EntryListIterator eli(*root->sublist); EntryListIterator eli(*root->sublist);
...@@ -1819,7 +1850,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd, ...@@ -1819,7 +1850,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
else if (insertUndocumented) else if (insertUndocumented)
{ {
Debug::print(Debug::Classes,0," Undocumented base class `%s' baseClassName=%s\n",bi->name.data(),baseClassName.data()); Debug::print(Debug::Classes,0," Undocumented base class `%s' baseClassName=%s\n",bi->name.data(),baseClassName.data());
baseClass=new ClassDef(baseClassName,ClassDef::Class); baseClass=new ClassDef(root->fileName,root->startLine,baseClassName,ClassDef::Class);
// add base class to this class // add base class to this class
cd->insertBaseClass(baseClass,bi->prot,bi->virt,templSpec); cd->insertBaseClass(baseClass,bi->prot,bi->virt,templSpec);
// add this class as super class to the base class // add this class as super class to the base class
...@@ -1912,10 +1943,11 @@ void computeClassRelations(Entry *root) ...@@ -1912,10 +1943,11 @@ void computeClassRelations(Entry *root)
else if (bName.right(2)!="::") else if (bName.right(2)!="::")
{ {
if (!root->name.isEmpty() && root->name[0]!='@') if (!root->name.isEmpty() && root->name[0]!='@')
warn("Warning: Compound %s\n" warn_undoc(
" defined in file %s at line %d\n" root->fileName,root->startLine,
" is not documented\n", "Warning: Compound %s is not documented.",
root->name.data(),root->fileName.data(),root->startLine); root->name.data()
);
} }
} }
EntryListIterator eli(*root->sublist); EntryListIterator eli(*root->sublist);
...@@ -2055,8 +2087,8 @@ void addMemberDocs(Entry *root, ...@@ -2055,8 +2087,8 @@ void addMemberDocs(Entry *root,
md->setBodyDef(fd); md->setBodyDef(fd);
} }
} }
md->setDefFile(root->fileName); //md->setDefFile(root->fileName);
md->setDefLine(root->startLine); //md->setDefLine(root->startLine);
if (root->inLine && !md->isInline()) md->setInline(TRUE); if (root->inLine && !md->isInline()) md->setInline(TRUE);
md->addSectionsToDefinition(root->anchors); md->addSectionsToDefinition(root->anchors);
addMemberToGroups(root,md); addMemberToGroups(root,md);
...@@ -2067,9 +2099,12 @@ void addMemberDocs(Entry *root, ...@@ -2067,9 +2099,12 @@ void addMemberDocs(Entry *root,
{ {
if (md->getMemberGroup()->groupId()!=root->mGrpId) if (md->getMemberGroup()->groupId()!=root->mGrpId)
{ {
warn("Warning: member %s belongs to two different group. The second " warn(
"one is found at line %d of %s and will be ignored\n", root->fileName,root->startLine,
md->name().data(),root->startLine,root->fileName.data()); "Warning: member %s belongs to two different groups. The second "
"one found here will be ignored.",
md->name().data()
);
} }
} }
else // set group id else // set group id
...@@ -2184,16 +2219,15 @@ static bool findUnrelatedFunction(Entry *root, ...@@ -2184,16 +2219,15 @@ static bool findUnrelatedFunction(Entry *root,
} }
if (!found) // no match if (!found) // no match
{ {
warn("Warning: no matching member found for \n%s\n" warn(root->fileName,root->startLine,
"in file %s at line %d\n", "Warning: no matching member found for \n%s",decl);
decl,root->fileName.data(),root->startLine);
} }
} }
else // got docs for an undefined member! else // got docs for an undefined member!
{ {
warn("Warning: documented function `%s'\nin file %s at line %d " warn(root->fileName,root->startLine,
"was not defined \n",decl, "Warning: documented function `%s' was not defined.",decl
root->fileName.data(),root->startLine); );
} }
return TRUE; return TRUE;
} }
...@@ -2771,9 +2805,10 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -2771,9 +2805,10 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
} }
} }
if (count==0 && !(isFriend && funcType=="class")) if (count==0 && !(isFriend && funcType=="class"))
warn("Warning: no matching member found for \n%s\n" warn(root->fileName,root->startLine,
"in file %s at line %d\n", "Warning: no matching member found for \n%s",
fullFuncDecl.data(),root->fileName.data(),root->startLine); fullFuncDecl.data()
);
#if 0 #if 0
else if (count>1) else if (count>1)
{ {
...@@ -2828,9 +2863,11 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -2828,9 +2863,11 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
else mtype=MemberDef::Function; else mtype=MemberDef::Function;
// new overloaded member function // new overloaded member function
MemberDef *md=new MemberDef(funcType,funcName,funcArgs,exceptions, MemberDef *md=new MemberDef(
root->protection,root->virt,root->stat,TRUE, root->fileName,root->startLine,
mtype,root->tArgList,root->argList); funcType,funcName,funcArgs,exceptions,
root->protection,root->virt,root->stat,TRUE,
mtype,root->tArgList,root->argList);
md->setMemberClass(cd); md->setMemberClass(cd);
md->setDefinition(funcDecl); md->setDefinition(funcDecl);
QCString doc=getOverloadDocs(); QCString doc=getOverloadDocs();
...@@ -2839,8 +2876,8 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -2839,8 +2876,8 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
md->setDocumentation(doc); md->setDocumentation(doc);
//md->setDecFile(root->fileName); //md->setDecFile(root->fileName);
//md->setDecLine(root->startLine); //md->setDecLine(root->startLine);
md->setDefFile(root->fileName); //md->setDefFile(root->fileName);
md->setDefLine(root->startLine); //md->setDefLine(root->startLine);
md->setPrototype(root->proto); md->setPrototype(root->proto);
md->addSectionsToDefinition(root->anchors); md->addSectionsToDefinition(root->anchors);
//if (root->mGrpId!=-1) //if (root->mGrpId!=-1)
...@@ -2862,9 +2899,10 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -2862,9 +2899,10 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
{ {
if (!findUnrelatedFunction(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl)) if (!findUnrelatedFunction(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
{ {
warn("Warning: Cannot determine class for function\n%s\n" warn(root->fileName,root->startLine,
"in file %s at line %d\n",fullFuncDecl.data(), "Warning: Cannot determine class for function\n%s",
root->fileName.data(),root->startLine); fullFuncDecl.data()
);
} }
} }
} }
...@@ -2908,7 +2946,9 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -2908,7 +2946,9 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
mtype=MemberDef::Function; mtype=MemberDef::Function;
// new related (member) function // new related (member) function
MemberDef *md=new MemberDef(funcType,funcName,funcArgs,exceptions, MemberDef *md=new MemberDef(
root->fileName,root->startLine,
funcType,funcName,funcArgs,exceptions,
root->protection,root->virt,root->stat,TRUE, root->protection,root->virt,root->stat,TRUE,
mtype,root->tArgList,root->argList); mtype,root->tArgList,root->argList);
//printf("Related member name=`%s' decl=`%s' bodyLine=`%d'\n", //printf("Related member name=`%s' decl=`%s' bodyLine=`%d'\n",
...@@ -2959,8 +2999,8 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -2959,8 +2999,8 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
md->setMemberClass(cd); md->setMemberClass(cd);
md->setInline(root->inLine); md->setInline(root->inLine);
md->setDefinition(funcDecl); md->setDefinition(funcDecl);
md->setDefFile(root->fileName); //md->setDefFile(root->fileName);
md->setDefLine(root->startLine); //md->setDefLine(root->startLine);
md->setPrototype(root->proto); md->setPrototype(root->proto);
md->setDocumentation(root->doc); md->setDocumentation(root->doc);
md->setBriefDescription(root->brief); md->setBriefDescription(root->brief);
...@@ -2978,8 +3018,11 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -2978,8 +3018,11 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
} }
else else
{ {
warn("Warning: class `%s' for related function `%s' is not " warn_undoc(root->fileName,root->startLine,
"documented\n", className.data(),funcName.data()); "Warning: class `%s' for related function `%s' is not "
"documented.",
className.data(),funcName.data()
);
} }
} }
else // unrelated not overloaded member found else // unrelated not overloaded member found
...@@ -2987,17 +3030,18 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded, ...@@ -2987,17 +3030,18 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
if (className.isEmpty() && if (className.isEmpty() &&
!findUnrelatedFunction(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl)) !findUnrelatedFunction(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
{ {
warn("Warning: class for member %s (file %s at line %d) cannot " warn(root->fileName,root->startLine,
"be found\n", funcName.data(),root->fileName.data(), "Warning: class for member %s cannot "
root->startLine); "be found.", funcName.data()
);
} }
} }
} }
else else
{ {
// this should not be called // this should not be called
warn("Warning: member with no name found in %s at line %d\n", warn(root->fileName,root->startLine,
root->fileName.data(),root->startLine); "Warning: member with no name found.");
} }
return; return;
} }
...@@ -3164,11 +3208,13 @@ void findEnums(Entry *root) ...@@ -3164,11 +3208,13 @@ void findEnums(Entry *root)
if (!name.isEmpty()) if (!name.isEmpty())
{ {
// new enum type // new enum type
md = new MemberDef(0,name,0,0,root->protection,Normal,FALSE,FALSE, md = new MemberDef(
MemberDef::Enumeration,0,0); root->fileName,root->startLine,
0,name,0,0,root->protection,Normal,FALSE,FALSE,
MemberDef::Enumeration,0,0);
if (!isGlobal) md->setMemberClass(cd); else md->setFileDef(fd); if (!isGlobal) md->setMemberClass(cd); else md->setFileDef(fd);
md->setDefFile(root->fileName); //md->setDefFile(root->fileName);
md->setDefLine(root->startLine); //md->setDefLine(root->startLine);
md->setBodySegment(root->bodyLine,root->endBodyLine); md->setBodySegment(root->bodyLine,root->endBodyLine);
bool ambig; bool ambig;
md->setBodyDef(findFileDef(&inputNameDict,root->fileName,ambig)); md->setBodyDef(findFileDef(&inputNameDict,root->fileName,ambig));
...@@ -3360,9 +3406,10 @@ void findEnumDocumentation(Entry *root) ...@@ -3360,9 +3406,10 @@ void findEnumDocumentation(Entry *root)
} }
if (!found) if (!found)
{ {
warn("Warning: Documentation for undefined enum `%s' found at" warn(root->fileName,root->startLine,
" line %d of file %s\n",name.data(), "Warning: Documentation for undefined enum `%s' found.",
root->startLine,root->fileName.data()); name.data()
);
} }
} }
} }
...@@ -3739,6 +3786,45 @@ void inheritDocumentation() ...@@ -3739,6 +3786,45 @@ void inheritDocumentation()
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void distributeMemberGroupDocumentation()
{
// for each class
ClassListIterator cli(classList);
ClassDef *cd;
for ( ; (cd=cli.current()) ; ++cli )
{
cd->distributeMemberGroupDocumentation();
}
// for each file
FileName *fn=inputNameList.first();
while (fn)
{
FileDef *fd=fn->first();
while (fd)
{
fd->distributeMemberGroupDocumentation();
fd=fn->next();
}
fn=inputNameList.next();
}
// for each namespace
NamespaceDef *nd=namespaceList.first();
while (nd)
{
nd->distributeMemberGroupDocumentation();
nd=namespaceList.next();
}
// for each group
GroupDef *gd=groupList.first();
while (gd)
{
gd->distributeMemberGroupDocumentation();
gd=groupList.next();
}
}
//----------------------------------------------------------------------------
void findDefineDocumentation(Entry *root) void findDefineDocumentation(Entry *root)
{ {
if ((root->section==Entry::DEFINEDOC_SEC || if ((root->section==Entry::DEFINEDOC_SEC ||
...@@ -3833,8 +3919,10 @@ void findDefineDocumentation(Entry *root) ...@@ -3833,8 +3919,10 @@ void findDefineDocumentation(Entry *root)
} }
else if (!root->doc.isEmpty() || !root->brief.isEmpty()) // define not found else if (!root->doc.isEmpty() || !root->brief.isEmpty()) // define not found
{ {
warn("Warning: documentation for unknown define %s found at line %d of " warn(root->fileName,root->startLine,
"file %s\n",root->name.data(),root->startLine,root->fileName.data()); "Warning: documentation for unknown define %s found.\n",
root->name.data()
);
} }
} }
EntryListIterator eli(*root->sublist); EntryListIterator eli(*root->sublist);
...@@ -3873,7 +3961,8 @@ void buildPageList(Entry *root) ...@@ -3873,7 +3961,8 @@ void buildPageList(Entry *root)
baseName=baseName.left(baseName.length()-4); baseName=baseName.left(baseName.length()-4);
else if (baseName.right(5)==".html") else if (baseName.right(5)==".html")
baseName=baseName.left(baseName.length()-5); baseName=baseName.left(baseName.length()-5);
pi=new PageInfo(baseName, root->doc, pi=new PageInfo(root->fileName,root->startLine,
baseName, root->doc,
root->args.stripWhiteSpace()); root->args.stripWhiteSpace());
QCString pageName; QCString pageName;
if (Config::caseSensitiveNames) if (Config::caseSensitiveNames)
...@@ -3914,14 +4003,17 @@ void findMainPage(Entry *root) ...@@ -3914,14 +4003,17 @@ void findMainPage(Entry *root)
if (mainPage==0) if (mainPage==0)
{ {
//printf("Found main page! \n======\n%s\n=======\n",root->doc.data()); //printf("Found main page! \n======\n%s\n=======\n",root->doc.data());
mainPage = new PageInfo("index", root->doc, mainPage = new PageInfo(root->fileName,root->startLine,
root->args.stripWhiteSpace()); "index", root->doc,
root->args.stripWhiteSpace());
setFileNameForSections(root->anchors,"index"); setFileNameForSections(root->anchors,"index");
} }
else else
{ {
warn("Warning: found more than one \\mainpage comment block!\n Skipping the " warn(root->fileName,root->startLine,
"block at line %d of %s\n",root->startLine,root->fileName.data()); "Warning: found more than one \\mainpage comment block! Skipping this "
"block."
);
} }
} }
EntryListIterator eli(*root->sublist); EntryListIterator eli(*root->sublist);
...@@ -3995,7 +4087,7 @@ void generatePageDocs() ...@@ -3995,7 +4087,7 @@ void generatePageDocs()
outputList->writeSection(si->label,si->title,FALSE); outputList->writeSection(si->label,si->title,FALSE);
} }
outputList->startTextBlock(); outputList->startTextBlock();
parseDoc(*outputList,0,0,pi->doc); parseDoc(*outputList,pi->defFileName,pi->defLine,0,0,pi->doc);
outputList->endTextBlock(); outputList->endTextBlock();
endFile(*outputList); endFile(*outputList);
outputList->enable(OutputGenerator::Man); outputList->enable(OutputGenerator::Man);
...@@ -4014,13 +4106,16 @@ void buildExampleList(Entry *root) ...@@ -4014,13 +4106,16 @@ void buildExampleList(Entry *root)
{ {
if (exampleDict[root->name]) if (exampleDict[root->name])
{ {
warn("Warning: Example %s was already documented. Ignoring " warn(root->fileName,root->startLine,
"documentation at line %d of %s\n",root->name.data(), "Warning: Example %s was already documented. Ignoring "
root->startLine,root->fileName.data()); "documentation found here.",
root->name.data()
);
} }
else else
{ {
PageInfo *pi=new PageInfo(root->name,root->doc,root->args); PageInfo *pi=new PageInfo(root->fileName,root->startLine,
root->name,root->doc,root->args);
setFileNameForSections(root->anchors, setFileNameForSections(root->anchors,
convertSlashes(pi->name,TRUE)+"-example" convertSlashes(pi->name,TRUE)+"-example"
); );
...@@ -4340,7 +4435,7 @@ void readTagFile(const char *tl) ...@@ -4340,7 +4435,7 @@ void readTagFile(const char *tl)
QFileInfo fi(fileName); QFileInfo fi(fileName);
if (!fi.exists() || !fi.isFile()) if (!fi.exists() || !fi.isFile())
{ {
warn("Warning: Tag file `%s' does not exist or is not a file. Skipping it...\n", err("Error: Tag file `%s' does not exist or is not a file. Skipping it...\n",
fileName.data()); fileName.data());
return; return;
} }
...@@ -4457,12 +4552,12 @@ void copyStyleSheet() ...@@ -4457,12 +4552,12 @@ void copyStyleSheet()
} }
else else
{ {
warn("Warning: could not write to style sheet %s\n",destFileName.data()); err("Error: could not write to style sheet %s\n",destFileName.data());
} }
} }
else else
{ {
warn("Warning: could not open user specified style sheet %s\n",Config::htmlStyleSheet.data()); err("Error: could not open user specified style sheet %s\n",Config::htmlStyleSheet.data());
Config::htmlStyleSheet.resize(0); // revert to the default Config::htmlStyleSheet.resize(0); // revert to the default
} }
} }
...@@ -4709,7 +4804,7 @@ void readFormulaRepository() ...@@ -4709,7 +4804,7 @@ void readFormulaRepository()
int se=line.find(':'); // find name and text separator. int se=line.find(':'); // find name and text separator.
if (se==-1) if (se==-1)
{ {
warn("Warning: formula.repository is corrupted!\n"); err("Error: formula.repository is corrupted!\n");
break; break;
} }
else else
...@@ -4969,7 +5064,7 @@ int main(int argc,char **argv) ...@@ -4969,7 +5064,7 @@ int main(int argc,char **argv)
if (input.isEmpty()) if (input.isEmpty())
{ {
warn("No input read, no output generated!\n"); err("No input read, no output generated!\n");
exit(1); exit(1);
} }
else else
...@@ -5117,6 +5212,9 @@ int main(int argc,char **argv) ...@@ -5117,6 +5212,9 @@ int main(int argc,char **argv)
inheritDocumentation(); inheritDocumentation();
} }
msg("Distributing member group documentation.\n");
distributeMemberGroupDocumentation();
/************************************************************************** /**************************************************************************
* Generate documentation * * Generate documentation *
**************************************************************************/ **************************************************************************/
......
...@@ -36,8 +36,14 @@ ...@@ -36,8 +36,14 @@
struct PageInfo struct PageInfo
{ {
PageInfo(const char *n,const char *d,const char *t) PageInfo(const char *f, int l,const char *n,const char *d,const char *t) :
{ name=n; doc=d; title=t; } defFileName(f), defLine(l), name(n), doc(d), title(t) {}
// where the page definition was found
QCString defFileName;
int defLine;
// contents of the page
QCString name; QCString name;
QCString doc; QCString doc;
QCString title; QCString title;
......
...@@ -207,6 +207,7 @@ void Entry::reset() ...@@ -207,6 +207,7 @@ void Entry::reset()
scopeSpec.resize(0); scopeSpec.resize(0);
memberSpec.resize(0); memberSpec.resize(0);
initializer.resize(0); initializer.resize(0);
startLine = 1;
bodyLine = -1; bodyLine = -1;
endBodyLine = -1; endBodyLine = -1;
mGrpId = -1; mGrpId = -1;
...@@ -217,6 +218,7 @@ void Entry::reset() ...@@ -217,6 +218,7 @@ void Entry::reset()
stat = FALSE; stat = FALSE;
proto = FALSE; proto = FALSE;
inLine = FALSE; inLine = FALSE;
subGrouping = TRUE;
protection = Public; protection = Public;
sublist->clear(); sublist->clear();
extends->clear(); extends->clear();
......
...@@ -159,6 +159,7 @@ class Entry ...@@ -159,6 +159,7 @@ class Entry
bool stat; // static ? bool stat; // static ?
bool proto; // prototype ? bool proto; // prototype ?
bool inLine; // inline ? bool inLine; // inline ?
bool subGrouping; // automatically group class members?
Specifier virt; // virtualness of the entry Specifier virt; // virtualness of the entry
Entry *parent; // parent node in the tree Entry *parent; // parent node in the tree
QCString type; // member type QCString type; // member type
......
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
file was read from a tag file or 0 otherwise file was read from a tag file or 0 otherwise
*/ */
FileDef::FileDef(const char *p,const char *nm,const char *ref) FileDef::FileDef(const char *p,const char *nm,const char *ref)
: Definition(nm) : Definition((QCString)p+nm,1,nm)
{ {
path=p; path=p;
filepath=path+nm; filepath=path+nm;
...@@ -83,6 +83,16 @@ void FileDef::computeAnchors() ...@@ -83,6 +83,16 @@ void FileDef::computeAnchors()
setAnchors('a',&allMemberList); setAnchors('a',&allMemberList);
} }
void FileDef::distributeMemberGroupDocumentation()
{
MemberGroupListIterator mgli(*memberGroupList);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->distributeMemberGroupDocumentation();
}
}
/*! Write the documentation page for this file to the file of output /*! Write the documentation page for this file to the file of output
generators \a ol. generators \a ol.
*/ */
...@@ -95,6 +105,8 @@ void FileDef::writeDocumentation(OutputList &ol) ...@@ -95,6 +105,8 @@ void FileDef::writeDocumentation(OutputList &ol)
//{ //{
// fn.prepend(stripFromPath(getPath().copy())); // fn.prepend(stripFromPath(getPath().copy()));
//} //}
//printf("WriteDocumentation %p diskname=%s\n",this,diskname.data());
QCString pageTitle=name()+" File Reference"; QCString pageTitle=name()+" File Reference";
startFile(ol,diskname,pageTitle); startFile(ol,diskname,pageTitle);
...@@ -113,7 +125,7 @@ void FileDef::writeDocumentation(OutputList &ol) ...@@ -113,7 +125,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{ {
//if (brief.at(bl-1)!='.' && brief.at(bl-1)!='!' && brief.at(bl!='?')) //if (brief.at(bl-1)!='.' && brief.at(bl-1)!='!' && brief.at(bl!='?'))
// brief+='.'; // brief+='.';
parseDoc(briefOutput,0,0,briefDescription()); parseDoc(briefOutput,filepath,1,0,0,briefDescription());
ol+=briefOutput; ol+=briefOutput;
ol.writeString(" \n"); ol.writeString(" \n");
ol.disableAllBut(OutputGenerator::Html); ol.disableAllBut(OutputGenerator::Html);
...@@ -293,7 +305,7 @@ void FileDef::writeDocumentation(OutputList &ol) ...@@ -293,7 +305,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{ {
//if (doc.at(dl-1)!='.' && doc.at(dl-1)!='!' && doc.at(dl-1)!='?') //if (doc.at(dl-1)!='.' && doc.at(dl-1)!='!' && doc.at(dl-1)!='?')
// doc+='.'; // doc+='.';
parseDoc(ol,0,0,documentation()+"\n"); parseDoc(ol,filepath,1,0,0,documentation()+"\n");
} }
//printf("Writing source ref for file %s\n",name().data()); //printf("Writing source ref for file %s\n",name().data());
if (Config::sourceBrowseFlag) if (Config::sourceBrowseFlag)
......
...@@ -125,6 +125,8 @@ class FileDef : public Definition ...@@ -125,6 +125,8 @@ class FileDef : public Definition
QList<IncludeInfo> *includeFileList() const { return includeList; } QList<IncludeInfo> *includeFileList() const { return includeList; }
QDict<IncludeInfo> *includeFileDict() const { return includeDict; } QDict<IncludeInfo> *includeFileDict() const { return includeDict; }
void distributeMemberGroupDocumentation();
private: private:
MemberList allMemberList; MemberList allMemberList;
MemberList defineMembers; MemberList defineMembers;
......
...@@ -55,7 +55,7 @@ void FileName::generateDiskNames() ...@@ -55,7 +55,7 @@ void FileName::generateDiskNames()
//printf("Multiple occurrences of %s\n",name.data()); //printf("Multiple occurrences of %s\n",name.data());
int i=0,j=0; int i=0,j=0;
bool found=FALSE; bool found=FALSE;
while (!found) while (!found) // search for the common prefix of all paths
{ {
fd=first(); fd=first();
while (fd && fd->isReference()) fd=next(); while (fd && fd->isReference()) fd=next();
...@@ -66,7 +66,7 @@ void FileName::generateDiskNames() ...@@ -66,7 +66,7 @@ void FileName::generateDiskNames()
{ {
if (!fd->isReference()) if (!fd->isReference())
{ {
//printf("i=%d fd->path=`%s' fd->name=`%s'\n",i,fd->path.data(),fd->name().data()); //printf("i=%d j=%d fd->path=`%s' fd->name=`%s'\n",i,j,fd->path.left(i).data(),fd->name().data());
if (i==(int)fd->path.length()) if (i==(int)fd->path.length())
{ {
//warning("Warning: Input file %s found multiple times!\n" //warning("Warning: Input file %s found multiple times!\n"
...@@ -88,8 +88,9 @@ void FileName::generateDiskNames() ...@@ -88,8 +88,9 @@ void FileName::generateDiskNames()
//printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data()); //printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data());
if (!fd->isReference()) if (!fd->isReference())
{ {
fd->setName(fd->path.right(fd->path.length()-j-1)+name); QCString prefix = fd->path.right(fd->path.length()-j-1);
fd->diskname=convertSlashes(fd->name()); fd->setName(prefix+name);
fd->diskname=convertSlashes(prefix+name);
} }
fd=next(); fd=next();
} }
......
...@@ -61,7 +61,8 @@ class FileNameListIterator : public QListIterator<FileName> ...@@ -61,7 +61,8 @@ class FileNameListIterator : public QListIterator<FileName>
class FileNameDict : public QDict<FileName> class FileNameDict : public QDict<FileName>
{ {
public: public:
FileNameDict(uint size) : QDict<FileName>(size) {} FileNameDict(uint size) :
QDict<FileName>(size,Config::caseSensitiveNames) {}
~FileNameDict() {} ~FileNameDict() {}
}; };
......
...@@ -31,8 +31,8 @@ ...@@ -31,8 +31,8 @@
#include "membergroup.h" #include "membergroup.h"
#include "doxygen.h" #include "doxygen.h"
GroupDef::GroupDef(const char *na,const char *t) : GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t) :
Definition(na) Definition(df,dl,na)
{ {
fileList = new FileList; fileList = new FileList;
classList = new ClassList; classList = new ClassList;
...@@ -66,6 +66,16 @@ GroupDef::~GroupDef() ...@@ -66,6 +66,16 @@ GroupDef::~GroupDef()
delete memberGroupDict; delete memberGroupDict;
} }
void GroupDef::distributeMemberGroupDocumentation()
{
MemberGroupListIterator mgli(*memberGroupList);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->distributeMemberGroupDocumentation();
}
}
void GroupDef::addFile(const FileDef *def) void GroupDef::addFile(const FileDef *def)
{ {
fileList->append(def); fileList->append(def);
...@@ -159,7 +169,7 @@ void GroupDef::writeDocumentation(OutputList &ol) ...@@ -159,7 +169,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
OutputList briefOutput(&ol); OutputList briefOutput(&ol);
if (!briefDescription().isEmpty()) if (!briefDescription().isEmpty())
{ {
parseDoc(briefOutput,name(),0,briefDescription()); parseDoc(briefOutput,defFileName,defLine,name(),0,briefDescription());
ol+=briefOutput; ol+=briefOutput;
ol.writeString(" \n"); ol.writeString(" \n");
ol.pushGeneratorState(); ol.pushGeneratorState();
...@@ -189,7 +199,7 @@ void GroupDef::writeDocumentation(OutputList &ol) ...@@ -189,7 +199,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
if (!fd->briefDescription().isEmpty() && Config::briefMemDescFlag) if (!fd->briefDescription().isEmpty() && Config::briefMemDescFlag)
{ {
ol.startMemberDescription(); ol.startMemberDescription();
parseDoc(ol,0,0,fd->briefDescription()); parseDoc(ol,defFileName,defLine,0,0,fd->briefDescription());
ol.endMemberDescription(); ol.endMemberDescription();
ol.newParagraph(); ol.newParagraph();
} }
...@@ -214,7 +224,7 @@ void GroupDef::writeDocumentation(OutputList &ol) ...@@ -214,7 +224,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
if (!nd->briefDescription().isEmpty() && Config::briefMemDescFlag) if (!nd->briefDescription().isEmpty() && Config::briefMemDescFlag)
{ {
ol.startMemberDescription(); ol.startMemberDescription();
parseDoc(ol,0,0,nd->briefDescription()); parseDoc(ol,defFileName,defLine,0,0,nd->briefDescription());
ol.endMemberDescription(); ol.endMemberDescription();
ol.newParagraph(); ol.newParagraph();
} }
...@@ -238,7 +248,7 @@ void GroupDef::writeDocumentation(OutputList &ol) ...@@ -238,7 +248,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
if (!gd->briefDescription().isEmpty() && Config::briefMemDescFlag) if (!gd->briefDescription().isEmpty() && Config::briefMemDescFlag)
{ {
ol.startMemberDescription(); ol.startMemberDescription();
parseDoc(ol,0,0,gd->briefDescription()); parseDoc(ol,defFileName,defLine,0,0,gd->briefDescription());
ol.endMemberDescription(); ol.endMemberDescription();
ol.newParagraph(); ol.newParagraph();
} }
...@@ -284,7 +294,7 @@ void GroupDef::writeDocumentation(OutputList &ol) ...@@ -284,7 +294,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
// write documentation // write documentation
if (!documentation().isEmpty()) if (!documentation().isEmpty())
{ {
parseDoc(ol,name(),0,documentation()+"\n"); parseDoc(ol,defFileName,defLine,name(),0,documentation()+"\n");
} }
} }
...@@ -427,7 +437,8 @@ void addMemberToGroups(Entry *root,MemberDef *md) ...@@ -427,7 +437,8 @@ void addMemberToGroups(Entry *root,MemberDef *md)
} }
else if (mgd!=gd) else if (mgd!=gd)
{ {
warn("Warning: Member %s found in multiple groups.!\n" warn(mgd->getDefFileName(),mgd->getDefLine(),
"Warning: Member %s found in multiple groups.!\n"
"The member will be put in group %s, and not in group %s", "The member will be put in group %s, and not in group %s",
md->name().data(),mgd->name().data(),gd->name().data() md->name().data(),mgd->name().data(),gd->name().data()
); );
......
...@@ -39,7 +39,7 @@ class MemberGroupDict; ...@@ -39,7 +39,7 @@ class MemberGroupDict;
class GroupDef : public Definition class GroupDef : public Definition
{ {
public: public:
GroupDef(const char *name,const char *title); GroupDef(const char *fileName,int line,const char *name,const char *title);
~GroupDef(); ~GroupDef();
QCString getOutputFileBase() const { return fileName; } QCString getOutputFileBase() const { return fileName; }
const char *groupTitle() const { return title; } const char *groupTitle() const { return title; }
...@@ -60,6 +60,7 @@ class GroupDef : public Definition ...@@ -60,6 +60,7 @@ class GroupDef : public Definition
return isLinkableInProject() || isReference(); return isLinkableInProject() || isReference();
} }
void computeAnchors(); void computeAnchors();
void distributeMemberGroupDocumentation();
private: private:
QCString title; // title of the group QCString title; // title of the group
......
...@@ -154,7 +154,7 @@ void HtmlGenerator::writeFooter(int part,bool external) ...@@ -154,7 +154,7 @@ void HtmlGenerator::writeFooter(int part,bool external)
} }
t << "doxygen.gif\" alt=\"doxygen\" " t << "doxygen.gif\" alt=\"doxygen\" "
<< "align=center border=0 " << endl << << "align=center border=0 " << endl <<
"width=118 height=53></a> " << versionString <<" "; "width=110 height=53></a>" << versionString <<" ";
} }
break; break;
default: default:
......
...@@ -393,7 +393,8 @@ void writeFileIndex(OutputList &ol) ...@@ -393,7 +393,8 @@ void writeFileIndex(OutputList &ol)
{ {
ol.docify(" ("); ol.docify(" (");
OutputList briefOutput(&ol); OutputList briefOutput(&ol);
parseDoc(briefOutput,0,0, parseDoc(briefOutput,fd->absFilePath(),1,
0,0,
abbreviate(fd->briefDescription(),fd->name())); abbreviate(fd->briefDescription(),fd->name()));
ol+=briefOutput; ol+=briefOutput;
ol.docify(")"); ol.docify(")");
...@@ -432,7 +433,9 @@ void writeFileIndex(OutputList &ol) ...@@ -432,7 +433,9 @@ void writeFileIndex(OutputList &ol)
{ {
ol.docify(" ("); ol.docify(" (");
OutputList briefOutput(&ol); OutputList briefOutput(&ol);
parseDoc(briefOutput,0,0, parseDoc(briefOutput,
fd->absFilePath(),1,
0,0,
abbreviate(fd->briefDescription(),fd->name())); abbreviate(fd->briefDescription(),fd->name()));
ol+=briefOutput; ol+=briefOutput;
ol.docify(")"); ol.docify(")");
...@@ -580,8 +583,10 @@ void writeNamespaceIndex(OutputList &ol) ...@@ -580,8 +583,10 @@ void writeNamespaceIndex(OutputList &ol)
if (!nd->briefDescription().isEmpty()) if (!nd->briefDescription().isEmpty())
{ {
OutputList briefOutput(&ol); OutputList briefOutput(&ol);
parseDoc(briefOutput,nd->name(),0, parseDoc(briefOutput,
abbreviate(nd->briefDescription(),nd->name())); nd->getDefFileName(),nd->getDefLine(),
nd->name(),0,
abbreviate(nd->briefDescription(),nd->name()));
ol+=briefOutput; ol+=briefOutput;
} }
else else
...@@ -654,8 +659,10 @@ void writeAnnotatedClassList(OutputList &ol) ...@@ -654,8 +659,10 @@ void writeAnnotatedClassList(OutputList &ol)
if (!cd->briefDescription().isEmpty()) if (!cd->briefDescription().isEmpty())
{ {
OutputList briefOutput(&ol); OutputList briefOutput(&ol);
parseDoc(briefOutput,cd->name(),0, parseDoc(briefOutput,
abbreviate(cd->briefDescription(),cd->name())); cd->getDefFileName(),cd->getDefLine(),
cd->name(),0,
abbreviate(cd->briefDescription(),cd->name()));
ol+=briefOutput; ol+=briefOutput;
} }
else else
...@@ -1454,10 +1461,15 @@ void writeGroupList(OutputList &ol) ...@@ -1454,10 +1461,15 @@ void writeGroupList(OutputList &ol)
{ {
ol.startDescItem(); ol.startDescItem();
ol.startTextLink(gd->getOutputFileBase(),0); ol.startTextLink(gd->getOutputFileBase(),0);
parseDoc(ol,0,0,gd->groupTitle()); parseDoc(ol,
gd->getDefFileName(),gd->getDefLine(),
0,0,
gd->groupTitle());
ol.endTextLink(); ol.endTextLink();
ol.endDescItem(); ol.endDescItem();
parseDoc(ol,0,0,gd->briefDescription()); parseDoc(ol,
gd->getDefFileName(),gd->getDefLine(),
0,0,gd->briefDescription());
ol.newParagraph(); ol.newParagraph();
} }
} }
...@@ -1517,6 +1529,11 @@ void writeIndex(OutputList &ol) ...@@ -1517,6 +1529,11 @@ void writeIndex(OutputList &ol)
//ol.disable(OutputGenerator::Latex); //ol.disable(OutputGenerator::Latex);
ol.disableAllBut(OutputGenerator::Html); ol.disableAllBut(OutputGenerator::Html);
QCString defFileName =
mainPage ? mainPage->defFileName.data() : "<generated>";
int defLine =
mainPage ? mainPage->defLine : 1;
if (!mainPage || mainPage->title.isEmpty()) if (!mainPage || mainPage->title.isEmpty())
ol.startFile("index","Main Index",FALSE); ol.startFile("index","Main Index",FALSE);
else else
...@@ -1526,7 +1543,7 @@ void writeIndex(OutputList &ol) ...@@ -1526,7 +1543,7 @@ void writeIndex(OutputList &ol)
ol.startTitleHead(0); ol.startTitleHead(0);
if (mainPage && !mainPage->title.isEmpty()) if (mainPage && !mainPage->title.isEmpty())
{ {
parseDoc(ol,0,0,mainPage->title); parseDoc(ol,defFileName,defLine,0,0,mainPage->title);
} }
else else
{ {
...@@ -1537,14 +1554,14 @@ void writeIndex(OutputList &ol) ...@@ -1537,14 +1554,14 @@ void writeIndex(OutputList &ol)
if (!Config::projectNumber.isEmpty()) if (!Config::projectNumber.isEmpty())
{ {
ol.startProjectNumber(); ol.startProjectNumber();
parseDoc(ol,0,0,Config::projectNumber); parseDoc(ol,defFileName,defLine,0,0,Config::projectNumber);
ol.endProjectNumber(); ol.endProjectNumber();
} }
if (Config::noIndexFlag) writeQuickLinks(ol,FALSE); if (Config::noIndexFlag) writeQuickLinks(ol,FALSE);
if (mainPage) if (mainPage)
{ {
parseDoc(ol,0,0,mainPage->doc); parseDoc(ol,defFileName,defLine,0,0,mainPage->doc);
} }
endFile(ol); endFile(ol);
...@@ -1565,7 +1582,7 @@ void writeIndex(OutputList &ol) ...@@ -1565,7 +1582,7 @@ void writeIndex(OutputList &ol)
if (!Config::projectNumber.isEmpty()) if (!Config::projectNumber.isEmpty())
{ {
ol.startProjectNumber(); ol.startProjectNumber();
parseDoc(ol,0,0,Config::projectNumber); parseDoc(ol,defFileName,defLine,0,0,Config::projectNumber);
ol.endProjectNumber(); ol.endProjectNumber();
} }
ol.endIndexSection(isTitlePageStart); ol.endIndexSection(isTitlePageStart);
...@@ -1577,7 +1594,7 @@ void writeIndex(OutputList &ol) ...@@ -1577,7 +1594,7 @@ void writeIndex(OutputList &ol)
ol.startIndexSection(isMainPage); ol.startIndexSection(isMainPage);
if (!mainPage->title.isEmpty()) if (!mainPage->title.isEmpty())
{ {
parseDoc(ol,0,0,mainPage->title); parseDoc(ol,defFileName,defLine,0,0,mainPage->title);
} }
else else
{ {
...@@ -1674,7 +1691,7 @@ void writeIndex(OutputList &ol) ...@@ -1674,7 +1691,7 @@ void writeIndex(OutputList &ol)
ol.writeSection(si->label,si->title,FALSE); ol.writeSection(si->label,si->title,FALSE);
} }
ol.startTextBlock(); ol.startTextBlock();
parseDoc(ol,0,0,mainPage->doc); parseDoc(ol,defFileName,defLine,0,0,mainPage->doc);
ol.endTextBlock(); ol.endTextBlock();
endFile(ol); endFile(ol);
ol.enable(OutputGenerator::Man); ol.enable(OutputGenerator::Man);
......
...@@ -596,7 +596,7 @@ void LatexGenerator::writeStyleInfo(int part) ...@@ -596,7 +596,7 @@ void LatexGenerator::writeStyleInfo(int part)
t << "\\newenvironment{CompactItemize}\n"; t << "\\newenvironment{CompactItemize}\n";
t << "{\n"; t << "{\n";
t << " \\begin{itemize}\n"; t << " \\begin{itemize}\n";
t << " \\setlength{\\itemsep}{-4pt}\n"; t << " \\setlength{\\itemsep}{-3pt}\n";
t << " \\setlength{\\parsep}{0pt}\n"; t << " \\setlength{\\parsep}{0pt}\n";
t << " \\setlength{\\topsep}{0pt}\n"; t << " \\setlength{\\topsep}{0pt}\n";
t << " \\setlength{\\partopsep}{0pt}\n"; t << " \\setlength{\\partopsep}{0pt}\n";
......
...@@ -31,303 +31,207 @@ unsigned char null_data[] = { ...@@ -31,303 +31,207 @@ unsigned char null_data[] = {
unsigned int null_len = 43; unsigned int null_len = 43;
unsigned char logo_data[] = { unsigned char logo_data[] = {
0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x76, 0x00, 0x35, 0x00, 0xf7, 0x00, 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x6e, 0x00, 0x35, 0x00, 0xe7, 0x00,
0x00, 0x31, 0x7b, 0x6b, 0x31, 0x7b, 0x73, 0x31, 0x84, 0x7b, 0x31, 0x84, 0x00, 0xff, 0xff, 0xe2, 0x9f, 0x20, 0x20, 0xb6, 0x25, 0x25, 0xff, 0xff,
0x84, 0x31, 0x8c, 0x7b, 0x31, 0x8c, 0x84, 0x31, 0x8c, 0x8c, 0x39, 0x7b, 0xe0, 0xff, 0xff, 0xdc, 0xdf, 0xdf, 0xc6, 0xff, 0xcc, 0xcc, 0xdf, 0xb2,
0x7b, 0x39, 0x84, 0x7b, 0x39, 0x84, 0x84, 0x39, 0x8c, 0x84, 0x39, 0x94, 0xb2, 0xfe, 0xfc, 0xd3, 0xbf, 0xbf, 0xa9, 0xff, 0xff, 0xe3, 0xf8, 0xe6,
0x8c, 0x39, 0x94, 0x94, 0x39, 0x9c, 0x94, 0x42, 0x7b, 0x73, 0x42, 0x8c, 0x93, 0xff, 0xff, 0xdb, 0xdf, 0xdf, 0xc0, 0xf5, 0xdc, 0x76, 0xdf, 0xdf,
0x84, 0x42, 0x94, 0x8c, 0x42, 0x9c, 0x8c, 0x42, 0x9c, 0x94, 0x42, 0xa5, 0xc4, 0xf8, 0xe6, 0x92, 0xde, 0xdc, 0xb9, 0xee, 0xc3, 0x2c, 0xfc, 0xf4,
0x9c, 0x4a, 0x5a, 0x5a, 0x4a, 0x84, 0x84, 0x4a, 0x8c, 0x84, 0x4a, 0x94, 0xbd, 0xfc, 0xf4, 0xbc, 0xfd, 0xf8, 0xc9, 0xdf, 0xdf, 0xc5, 0xf3, 0xd6,
0x8c, 0x4a, 0x94, 0x94, 0x4a, 0x9c, 0x94, 0x4a, 0xa5, 0x94, 0x4a, 0xa5, 0x64, 0xfb, 0xf0, 0xaf, 0xd5, 0xbb, 0x57, 0xf9, 0xeb, 0xa1, 0xf6, 0xe2,
0x9c, 0x4a, 0xa5, 0xa5, 0x52, 0x52, 0x52, 0x52, 0x73, 0x73, 0x52, 0x7b, 0x86, 0xd9, 0xc9, 0x81, 0xf7, 0xe1, 0x86, 0xbf, 0xbf, 0xa4, 0xff, 0xff,
0x7b, 0x52, 0x84, 0x84, 0x52, 0x94, 0x8c, 0x52, 0x9c, 0x94, 0x52, 0xa5, 0xdf, 0xf4, 0xd6, 0x64, 0x3d, 0x36, 0x19, 0xfd, 0xf8, 0xc8, 0xfa, 0xef,
0x9c, 0x52, 0xad, 0xa5, 0x52, 0xb5, 0xad, 0x5a, 0x5a, 0x5a, 0x5a, 0x63, 0xaf, 0x20, 0x1f, 0x18, 0xf9, 0xeb, 0xa0, 0xfd, 0xf9, 0xc9, 0xdd, 0xd9,
0x63, 0x5a, 0x6b, 0x6b, 0x5a, 0x7b, 0x7b, 0x5a, 0x8c, 0x84, 0x5a, 0x8c, 0xb0, 0xfc, 0xf5, 0xbc, 0xb2, 0x92, 0x21, 0xdc, 0xd5, 0xa4, 0xdf, 0xdf,
0x8c, 0x5a, 0x94, 0x8c, 0x5a, 0x94, 0x94, 0x5a, 0x9c, 0x94, 0x5a, 0xa5, 0xc7, 0x3f, 0x3c, 0x2c, 0x1f, 0x1c, 0x0f, 0xb8, 0xa5, 0x58, 0xf7, 0xe2,
0x9c, 0x5a, 0xa5, 0xa5, 0x5a, 0xad, 0xa5, 0x5a, 0xb5, 0xad, 0x5a, 0xbd, 0x85, 0xf5, 0xdc, 0x75, 0x20, 0x1f, 0x19, 0xff, 0xfe, 0xdb, 0xbf, 0xbf,
0xb5, 0x63, 0x63, 0x63, 0x63, 0x6b, 0x6b, 0x63, 0x73, 0x73, 0x63, 0x7b, 0xaa, 0xf7, 0xe1, 0x85, 0xf9, 0xea, 0xa1, 0xd0, 0xab, 0x26, 0xf2, 0xd0,
0x7b, 0x63, 0x84, 0x84, 0x63, 0x8c, 0x8c, 0x63, 0x94, 0x94, 0x63, 0xa5, 0x52, 0xff, 0xfc, 0xd3, 0xda, 0xce, 0x8d, 0x40, 0x3f, 0x35, 0xdc, 0xd5,
0x9c, 0x63, 0xa5, 0xa5, 0x63, 0xad, 0xa5, 0x63, 0xb5, 0xad, 0x63, 0xb5, 0xa5, 0xf7, 0xe2, 0x86, 0xfa, 0xf0, 0xaf, 0x3e, 0x3b, 0x28, 0x40, 0x40,
0xb5, 0x63, 0xbd, 0xbd, 0x6b, 0x6b, 0x6b, 0x6b, 0x73, 0x73, 0x6b, 0x7b, 0x39, 0x40, 0x40, 0x37, 0xdb, 0xd2, 0x99, 0xbb, 0xb0, 0x78, 0xfb, 0xef,
0x7b, 0x6b, 0x8c, 0x8c, 0x6b, 0x9c, 0x94, 0x6b, 0xa5, 0x9c, 0x6b, 0xad, 0xaf, 0xd6, 0xc0, 0x67, 0xfa, 0xeb, 0xa1, 0xdd, 0xda, 0xb0, 0xf6, 0xe1,
0xa5, 0x6b, 0xb5, 0xad, 0x6b, 0xb5, 0xb5, 0x6b, 0xbd, 0xb5, 0x6b, 0xbd, 0x86, 0x04, 0x04, 0x03, 0xfe, 0xfc, 0xd4, 0x5c, 0x51, 0x26, 0xba, 0xac,
0xbd, 0x6b, 0xc6, 0xbd, 0x6b, 0xc6, 0xc6, 0x6b, 0xce, 0xc6, 0x73, 0x73, 0x6e, 0xdf, 0xdf, 0xc3, 0xef, 0xc6, 0x34, 0xf0, 0xca, 0x42, 0xb9, 0xa9,
0x73, 0x73, 0x7b, 0x7b, 0x73, 0x84, 0x84, 0x73, 0x8c, 0x8c, 0x73, 0x94, 0x64, 0xff, 0xfe, 0xdc, 0x1e, 0x1b, 0x0d, 0x1f, 0x1c, 0x11, 0x1f, 0x1d,
0x8c, 0x73, 0x94, 0x94, 0x73, 0x9c, 0x94, 0x73, 0x9c, 0x9c, 0x73, 0xa5, 0x14, 0xf5, 0xdd, 0x76, 0x5b, 0x51, 0x26, 0xdd, 0xda, 0xaf, 0xf9, 0xea,
0x9c, 0x73, 0xa5, 0xa5, 0x73, 0xad, 0xad, 0x73, 0xb5, 0xad, 0x73, 0xb5, 0xa0, 0x3f, 0x3d, 0x2f, 0xb5, 0x9c, 0x3d, 0xd6, 0xc1, 0x67, 0xdc, 0xd2,
0xb5, 0x73, 0xbd, 0xbd, 0x73, 0xce, 0xce, 0x7b, 0x7b, 0x7b, 0x7b, 0x8c, 0x99, 0xfa, 0xeb, 0xa0, 0xd5, 0xbc, 0x57, 0xd9, 0xc9, 0x80, 0x3f, 0x3e,
0x8c, 0x7b, 0x94, 0x94, 0x7b, 0x9c, 0x9c, 0x7b, 0xa5, 0xa5, 0x7b, 0xb5, 0x32, 0x3e, 0x3a, 0x25, 0xfe, 0xf8, 0xc8, 0xda, 0xce, 0x8c, 0x20, 0x20,
0xb5, 0x7b, 0xbd, 0xb5, 0x7b, 0xbd, 0xbd, 0x7b, 0xc6, 0xc6, 0x7b, 0xce, 0x1c, 0xf7, 0xe6, 0x93, 0xd7, 0xc6, 0x75, 0x3d, 0x37, 0x1e, 0xfb, 0xef,
0xc6, 0x7b, 0xce, 0xce, 0x7b, 0xd6, 0xce, 0x7b, 0xd6, 0xd6, 0x7b, 0xde, 0xae, 0xfd, 0xf9, 0xc8, 0xbe, 0xbd, 0x9e, 0xbb, 0xb4, 0x83, 0xd7, 0xc5,
0xd6, 0x84, 0x84, 0x84, 0x84, 0x8c, 0x8c, 0x84, 0x9c, 0x94, 0x84, 0x9c, 0x75, 0x1f, 0x1d, 0x12, 0xdc, 0xd1, 0x98, 0x20, 0x20, 0x1b, 0x1f, 0x1e,
0x9c, 0x84, 0xa5, 0x9c, 0x84, 0xad, 0xad, 0x84, 0xb5, 0xb5, 0x84, 0xc6, 0x16, 0x1f, 0x1b, 0x0d, 0xbf, 0xbf, 0xa5, 0x40, 0x40, 0x38, 0xdf, 0xdc,
0xc6, 0x84, 0xce, 0xce, 0x84, 0xd6, 0xd6, 0x8c, 0x7b, 0x7b, 0x8c, 0x84, 0xb9, 0xfc, 0xf5, 0xbd, 0xf4, 0xd6, 0x65, 0xfa, 0xea, 0xa1, 0xd8, 0xc9,
0x84, 0x8c, 0x8c, 0x8c, 0x8c, 0xa5, 0xa5, 0x8c, 0xad, 0xad, 0x8c, 0xb5, 0x81, 0xf0, 0xcb, 0x42, 0xdf, 0xde, 0xc0, 0x1e, 0x18, 0x06, 0xf6, 0xdc,
0xb5, 0x8c, 0xbd, 0xb5, 0x8c, 0xbd, 0xbd, 0x8c, 0xc6, 0xc6, 0x8c, 0xce, 0x75, 0xbf, 0xbf, 0xa8, 0xd8, 0xc6, 0x75, 0xd6, 0xc0, 0x66, 0xf7, 0xe6,
0xce, 0x8c, 0xde, 0xde, 0x94, 0x7b, 0x7b, 0x94, 0x94, 0x94, 0x94, 0x9c, 0x92, 0xf1, 0xca, 0x42, 0xd2, 0xb2, 0x3a, 0xbe, 0xbe, 0x9e, 0x43, 0x40,
0x9c, 0x94, 0xa5, 0xa5, 0x94, 0xad, 0xad, 0x94, 0xbd, 0xb5, 0x94, 0xc6, 0x2f, 0xd7, 0xc6, 0x74, 0xb8, 0xa6, 0x58, 0xbc, 0xb4, 0x83, 0xda, 0xcd,
0xbd, 0x9c, 0x9c, 0x9c, 0x9c, 0xa5, 0xa5, 0x9c, 0xb5, 0xb5, 0x9c, 0xbd, 0x8d, 0xf4, 0xd7, 0x64, 0xbb, 0xb0, 0x79, 0xfe, 0xf9, 0xc9, 0x5e, 0x5a,
0xbd, 0x9c, 0xc6, 0xbd, 0x9c, 0xc6, 0xc6, 0x9c, 0xce, 0xc6, 0x9c, 0xce, 0x42, 0xfa, 0xea, 0xa0, 0x60, 0x60, 0x55, 0x71, 0x17, 0x17, 0xbc, 0xb4,
0xce, 0x9c, 0xd6, 0xd6, 0xa5, 0x5a, 0x5a, 0xa5, 0x63, 0x63, 0xa5, 0x84, 0x82, 0x88, 0x1c, 0x1c, 0xba, 0xac, 0x6d, 0xbd, 0xb7, 0x8e, 0xef, 0xc5,
0x84, 0xa5, 0x94, 0x94, 0xa5, 0xa5, 0xa5, 0xa5, 0xad, 0xa5, 0xa5, 0xbd, 0x34, 0xd8, 0xc5, 0x75, 0xff, 0xff, 0xdd, 0xfb, 0xf0, 0xae, 0x44, 0x44,
0xbd, 0xa5, 0xc6, 0xc6, 0xa5, 0xce, 0xce, 0xa5, 0xd6, 0xd6, 0xa5, 0xde, 0x3a, 0xff, 0xff, 0xe1, 0xde, 0xdf, 0xc0, 0x10, 0x10, 0x0d, 0xf3, 0xd7,
0xde, 0xa5, 0xe7, 0xde, 0xad, 0x21, 0x18, 0xad, 0x21, 0x21, 0xad, 0x52, 0x64, 0xd1, 0xad, 0x2d, 0xbd, 0xb8, 0x8d, 0xdf, 0xdf, 0xc2, 0xbf, 0x99,
0x52, 0xad, 0x63, 0x63, 0xad, 0x7b, 0x7b, 0xad, 0xad, 0xad, 0xad, 0xb5, 0x99, 0x3e, 0x39, 0x22, 0x5f, 0x5c, 0x47, 0xef, 0xc6, 0x35, 0xf6, 0xdc,
0xb5, 0xad, 0xbd, 0xbd, 0xad, 0xce, 0xc6, 0xad, 0xce, 0xce, 0xad, 0xd6, 0x76, 0xff, 0xff, 0xde, 0x61, 0x61, 0x54, 0x60, 0x60, 0x54, 0xfb, 0xf4,
0xce, 0xad, 0xd6, 0xd6, 0xb5, 0x21, 0x21, 0xb5, 0x52, 0x52, 0xb5, 0x5a, 0xbc, 0x3e, 0x38, 0x22, 0x3f, 0x3b, 0x28, 0x20, 0x20, 0x1a, 0xdc, 0xd6,
0x5a, 0xb5, 0x63, 0x63, 0xb5, 0x6b, 0x6b, 0xb5, 0xb5, 0xb5, 0xb5, 0xc6, 0xa4, 0x5f, 0x5e, 0x4c, 0xbb, 0xb3, 0x82, 0x5e, 0x58, 0x3c, 0x10, 0x0f,
0xc6, 0xb5, 0xce, 0xce, 0xb5, 0xd6, 0xce, 0xb5, 0xd6, 0xd6, 0xb5, 0xde, 0x0b, 0xde, 0xd9, 0xb0, 0xe3, 0xd9, 0x9f, 0xd2, 0xb1, 0x3a, 0xbb, 0xb4,
0xd6, 0xb5, 0xde, 0xde, 0xb5, 0xe7, 0xe7, 0xbd, 0x21, 0x21, 0xbd, 0x29, 0x82, 0xcd, 0xc6, 0x99, 0xa0, 0x90, 0x4d, 0xe5, 0xe2, 0xb6, 0xb8, 0xa9,
0x29, 0xbd, 0x42, 0x42, 0xbd, 0x52, 0x52, 0xbd, 0x73, 0x73, 0xbd, 0x7b, 0x64, 0xdf, 0xdf, 0xc1, 0xda, 0xcd, 0x8c, 0xfa, 0xf0, 0xae, 0x08, 0x07,
0x7b, 0xbd, 0x84, 0x84, 0xbd, 0xbd, 0xbd, 0xbd, 0xc6, 0xc6, 0xbd, 0xce, 0x05, 0xfe, 0xf8, 0xc9, 0xfa, 0xef, 0xae, 0xbf, 0xbe, 0xa5, 0x62, 0x5c,
0xce, 0xbd, 0xd6, 0xd6, 0xbd, 0xde, 0xde, 0xc6, 0x39, 0x39, 0xc6, 0x73, 0x3f, 0xf1, 0xd0, 0x52, 0x5e, 0x58, 0x3d, 0xbe, 0xba, 0x97, 0x8f, 0x8f,
0x73, 0xc6, 0x7b, 0x7b, 0xc6, 0x84, 0x84, 0xc6, 0x8c, 0x8c, 0xc6, 0x94, 0x7f, 0x60, 0x5f, 0x50, 0x28, 0x26, 0x1d, 0xb9, 0xac, 0x6e, 0x71, 0x63,
0x94, 0xc6, 0xc6, 0xc6, 0xc6, 0xce, 0xce, 0xc6, 0xd6, 0xd6, 0xc6, 0xde, 0x2e, 0xdb, 0xcd, 0x8d, 0xd8, 0xc5, 0x74, 0xfe, 0xfd, 0xd4, 0x98, 0x8f,
0xde, 0xc6, 0xef, 0xe7, 0xce, 0x7b, 0x7b, 0xce, 0x8c, 0x8c, 0xce, 0x94, 0x63, 0x60, 0x5e, 0x4c, 0xc2, 0xb7, 0x7e, 0xf6, 0xe1, 0x85, 0xf6, 0xe2,
0x94, 0xce, 0xce, 0xce, 0xce, 0xd6, 0xd6, 0xce, 0xde, 0xde, 0xce, 0xe7, 0x85, 0x0f, 0x0d, 0x06, 0x42, 0x3e, 0x2b, 0xbe, 0xbb, 0x97, 0xdc, 0xd1,
0xe7, 0xd6, 0x84, 0x84, 0xd6, 0x94, 0x8c, 0xd6, 0x94, 0x94, 0xd6, 0x9c, 0x99, 0x3d, 0x34, 0x15, 0xbd, 0xb7, 0x8d, 0x98, 0x86, 0x3e, 0x99, 0x89,
0x9c, 0xd6, 0xad, 0xad, 0xd6, 0xd6, 0xd6, 0xd6, 0xe7, 0xde, 0xd6, 0xef, 0x4a, 0xee, 0xc5, 0x34, 0x27, 0x25, 0x19, 0xe1, 0xd0, 0x84, 0x60, 0x60,
0xef, 0xde, 0xa5, 0xa5, 0xde, 0xbd, 0xbd, 0xde, 0xce, 0xce, 0xde, 0xde, 0x52, 0x3e, 0x39, 0x21, 0x3e, 0x38, 0x21, 0x60, 0x5f, 0x4f, 0x44, 0x44,
0xde, 0xde, 0xe7, 0xe7, 0xde, 0xef, 0xe7, 0xde, 0xef, 0xef, 0xe7, 0xbd, 0x3b, 0xee, 0xc6, 0x35, 0x1e, 0x1a, 0x0a, 0xf6, 0xdd, 0x76, 0xdb, 0xd2,
0xbd, 0xe7, 0xe7, 0xe7, 0xe7, 0xef, 0xef, 0xe7, 0xf7, 0xf7, 0xef, 0xd6, 0x98, 0xb5, 0x9c, 0x3e, 0xdc, 0xd2, 0x98, 0x85, 0x6d, 0x19, 0x18, 0x17,
0xd6, 0xef, 0xef, 0xef, 0xef, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xff, 0x10, 0xd0, 0xad, 0x2e, 0x93, 0x7c, 0x28, 0xee, 0xc6, 0x34, 0x3c, 0x34,
0xf7, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00, 0x15, 0xdd, 0xd9, 0xaf, 0xe3, 0xe3, 0xc7, 0x1f, 0x1f, 0x18, 0xbf, 0xbe,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0xbf, 0xbd, 0x9e, 0x44, 0x43, 0x38, 0x30, 0x30, 0x29, 0xef, 0xc5,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x48, 0x47, 0x3c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x35, 0x00, 0x00, 0x08, 0xff, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0xff, 0x00, 0x2c, 0x00, 0x00,
0xfe, 0x00, 0xdd, 0x09, 0x1c, 0x48, 0xb0, 0xa0, 0xba, 0x45, 0x71, 0x76, 0x00, 0x00, 0x6e, 0x00, 0x35, 0x00, 0x00, 0x08, 0xfe, 0x00, 0xff, 0x09,
0xc8, 0x29, 0xc8, 0xb0, 0xa1, 0xc3, 0x87, 0x10, 0x23, 0x4a, 0x9c, 0x48, 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x08, 0x13, 0x2a, 0x5c, 0xc8, 0xb0,
0xb1, 0xa2, 0x3a, 0x74, 0xe4, 0xb4, 0x05, 0x10, 0x10, 0xa0, 0x48, 0xc5, 0xa1, 0xc3, 0x87, 0x10, 0x23, 0x4a, 0x9c, 0x48, 0xb1, 0xa2, 0xc5, 0x8b,
0x8f, 0x20, 0x43, 0x8a, 0x1c, 0x59, 0x10, 0x5d, 0xb6, 0x5e, 0xae, 0x14, 0x18, 0x33, 0x56, 0xac, 0xc7, 0xb1, 0x63, 0x3d, 0x8d, 0x20, 0x43, 0x5a,
0x08, 0x10, 0xe0, 0x91, 0xa4, 0xcb, 0x97, 0x30, 0x43, 0xaa, 0xfb, 0xd6, 0xac, 0x17, 0xa7, 0x81, 0xc9, 0x38, 0x1f, 0x45, 0xaa, 0x5c, 0xc9, 0xb0,
0x4b, 0x50, 0x1b, 0x08, 0x1c, 0x8d, 0xc4, 0xdc, 0xc9, 0xb3, 0xe7, 0x40, 0x5e, 0x03, 0x02, 0x30, 0x1b, 0xa4, 0x64, 0x49, 0xb3, 0xa6, 0x40, 0x97,
0x75, 0xd9, 0x2a, 0x3d, 0x09, 0xb2, 0x40, 0xa5, 0x4e, 0x9f, 0x48, 0x93, 0x30, 0x09, 0xc8, 0xb4, 0xc9, 0x93, 0x25, 0xce, 0x98, 0x33, 0x7b, 0x0a,
0xca, 0x84, 0x86, 0xe8, 0x09, 0x8d, 0x05, 0x0b, 0x04, 0x1c, 0x55, 0x4a, 0xcd, 0xf8, 0x53, 0x67, 0xd0, 0xa1, 0x48, 0x29, 0x16, 0xdd, 0x99, 0xb4,
0xb5, 0xaa, 0x43, 0x93, 0x88, 0x82, 0xd0, 0xb8, 0xb0, 0x60, 0xc0, 0x54, 0xe9, 0xc4, 0xa5, 0x47, 0x9d, 0x4a, 0x5d, 0x08, 0x75, 0xaa, 0xd5, 0x96,
0xab, 0x60, 0xad, 0x02, 0xcd, 0x4a, 0x43, 0x42, 0xd4, 0x23, 0x61, 0xd3, 0x0d, 0x2a, 0xc1, 0xc4, 0x15, 0xf5, 0xaa, 0xd7, 0x9b, 0x9e, 0x3e, 0x7c,
0x56, 0x55, 0xc7, 0x34, 0x48, 0x8d, 0x0d, 0x10, 0x14, 0x60, 0x51, 0x4b, 0x20, 0xe5, 0xa9, 0xeb, 0xd7, 0xa4, 0x1e, 0x3b, 0x3e, 0x18, 0xc0, 0xf6,
0x17, 0x29, 0x5b, 0xb2, 0x19, 0x24, 0x14, 0xf8, 0x5a, 0xb7, 0xaf, 0xcb, 0x41, 0xca, 0xb4, 0x1e, 0x07, 0xc6, 0xbd, 0xd9, 0xf1, 0xdf, 0x5c, 0x82,
0xb1, 0x41, 0x4e, 0x60, 0x90, 0xa0, 0x00, 0xad, 0xdf, 0xc3, 0x24, 0xef, 0x77, 0xe1, 0xde, 0xb5, 0xab, 0x97, 0xae, 0x5e, 0x8e, 0x11, 0x39, 0x26,
0x6a, 0xcd, 0xab, 0x80, 0x2f, 0xe2, 0xc7, 0x13, 0xd1, 0xb5, 0xad, 0x31, 0x28, 0x60, 0xa1, 0x00, 0xe1, 0x02, 0x98, 0x00, 0x28, 0x2e, 0xf0, 0xb1,
0xc2, 0xac, 0x61, 0xc8, 0x98, 0x1d, 0x5e, 0x64, 0xa6, 0xe9, 0x8f, 0x9f, 0xde, 0xe0, 0xc2, 0x86, 0x0b, 0xac, 0x98, 0xd1, 0x38, 0x81, 0x05, 0x0b,
0x38, 0x42, 0x68, 0x90, 0x20, 0x7c, 0x59, 0xa0, 0x3a, 0x75, 0xe0, 0x64, 0x09, 0x2a, 0x17, 0x48, 0xd0, 0xa8, 0x5e, 0xa3, 0xc1, 0x99, 0xf1, 0x5a,
0x39, 0xfa, 0x03, 0xa9, 0x96, 0x39, 0x87, 0xe6, 0x82, 0x31, 0x04, 0x06, 0xde, 0xdc, 0x71, 0xb0, 0xe1, 0xc2, 0x90, 0x43, 0x0b, 0x3e, 0x7d, 0x3a,
0xcc, 0xdd, 0xe9, 0x69, 0xb3, 0x50, 0x35, 0x54, 0x17, 0x2c, 0xd8, 0xeb, 0xb3, 0xe3, 0xcb, 0x90, 0x51, 0x93, 0x7e, 0xe8, 0xb8, 0x80, 0x02, 0xc5,
0x9f, 0xea, 0xd2, 0x2d, 0xcb, 0xc4, 0xa8, 0x14, 0x30, 0x69, 0xe1, 0xc0, 0xb8, 0x6f, 0x2b, 0x56, 0xb0, 0xa2, 0xde, 0x8f, 0x04, 0xb7, 0x83, 0xe3,
0x81, 0x33, 0xa8, 0x4e, 0x1a, 0x26, 0x39, 0x87, 0x62, 0x95, 0x2b, 0xb8, 0x9e, 0xfc, 0x63, 0x06, 0x80, 0xdb, 0x05, 0x7e, 0x8c, 0xf9, 0x51, 0xe0,
0xae, 0x9c, 0xb4, 0x5f, 0xda, 0xd4, 0x4d, 0x3b, 0xe5, 0xa7, 0xd1, 0x34, 0x78, 0xef, 0xc1, 0x00, 0x18, 0xcb, 0x35, 0xae, 0x80, 0xf7, 0xef, 0x15,
0xcd, 0xe8, 0xc0, 0xfe, 0xbd, 0xda, 0xf2, 0x03, 0xc8, 0x92, 0x25, 0x40, 0xbb, 0x75, 0x57, 0xe7, 0xcd, 0x71, 0x46, 0xf3, 0xe3, 0xda, 0x15, 0xfe,
0x62, 0xdc, 0xa8, 0xbc, 0xe0, 0xb2, 0x3a, 0x72, 0xdf, 0x0c, 0xbd, 0x28, 0x50, 0xc6, 0xae, 0x3b, 0x7b, 0xf5, 0xd0, 0x0d, 0xeb, 0x7d, 0xc7, 0xbd,
0xf1, 0xc3, 0x89, 0x13, 0x26, 0x4d, 0x38, 0xa5, 0x13, 0x88, 0x51, 0x9b, 0x9b, 0x3d, 0xe3, 0x04, 0xec, 0xe3, 0x2b, 0xce, 0xcc, 0x9e, 0xf3, 0x7a,
0x26, 0x34, 0x4e, 0x7c, 0xf7, 0x1e, 0x39, 0xd2, 0x2c, 0x50, 0x00, 0x16, 0xc6, 0xd8, 0xe7, 0x37, 0x1e, 0x96, 0x1f, 0xc0, 0x0c, 0xe6, 0xf2, 0xd5,
0xc9, 0x64, 0xb1, 0x80, 0x04, 0x1b, 0xfc, 0xe6, 0x0e, 0x46, 0x19, 0x95, 0xe7, 0x58, 0x79, 0x86, 0xb9, 0xa7, 0x5e, 0x80, 0x02, 0xb6, 0xc4, 0x07,
0xc0, 0xe0, 0x21, 0x0f, 0x96, 0x13, 0x1f, 0x09, 0x25, 0x4c, 0x30, 0xc0, 0x5b, 0x03, 0x7c, 0x30, 0xc0, 0x03, 0x10, 0x36, 0xc8, 0xd6, 0x07, 0x6e,
0x4a, 0x01, 0x74, 0x88, 0xc0, 0x7e, 0x17, 0x81, 0xe3, 0x0b, 0x16, 0x12, 0x31, 0xc1, 0xe0, 0x00, 0x4c, 0x44, 0x28, 0x21, 0x13, 0xf5, 0x2c, 0xc8,
0x44, 0x10, 0x41, 0x89, 0x0f, 0x30, 0x72, 0x1a, 0x39, 0xe4, 0x44, 0xd3, 0xe0, 0x5a, 0x6c, 0x31, 0x61, 0x4a, 0x3d, 0x33, 0x30, 0xc8, 0xa1, 0x5d,
0x61, 0x00, 0x71, 0x5c, 0x02, 0x01, 0x07, 0x24, 0x28, 0x70, 0x00, 0x85, 0x6b, 0x89, 0xf5, 0x80, 0x1c, 0x72, 0x80, 0xf8, 0x60, 0x3b, 0x29, 0x3e,
0x25, 0x7d, 0x03, 0x4d, 0x1c, 0x1b, 0xc8, 0xf0, 0x43, 0x79, 0x33, 0xfc, 0xc8, 0x91, 0x8b, 0x7c, 0xd4, 0x63, 0x0a, 0x88, 0x14, 0xd6, 0xe3, 0x62,
0x20, 0x03, 0x09, 0x70, 0xb5, 0x67, 0x9b, 0x49, 0xbe, 0xec, 0x30, 0x01, 0x88, 0x0c, 0x3a, 0xe8, 0x56, 0x4b, 0x79, 0x10, 0xc0, 0x80, 0x0c, 0x0c,
0x09, 0x32, 0xe0, 0x77, 0x46, 0x13, 0x4d, 0x74, 0x51, 0xc7, 0x36, 0x26, 0x78, 0x00, 0x84, 0x1b, 0x97, 0x78, 0xc0, 0xc0, 0x92, 0x0c, 0xc8, 0x04,
0x21, 0x83, 0x49, 0x13, 0xf6, 0x9d, 0x61, 0x21, 0x32, 0xbd, 0xbc, 0xd0, 0x13, 0x14, 0x45, 0x1e, 0x09, 0x84, 0x92, 0x50, 0xc8, 0x40, 0x80, 0x91,
0xd5, 0x02, 0x7a, 0xc4, 0xb1, 0xe0, 0x06, 0x8f, 0x98, 0xf6, 0x0d, 0x32, 0x0d, 0x10, 0xc9, 0x24, 0x01, 0x32, 0x78, 0x30, 0x46, 0x3d, 0x72, 0xbc,
0xae, 0xf0, 0xc1, 0xc1, 0x06, 0x0b, 0x98, 0x42, 0xce, 0x49, 0x2e, 0x18, 0xb4, 0xe4, 0x3b, 0xf5, 0x78, 0x20, 0x83, 0x95, 0x04, 0xf8, 0x02, 0x44,
0xc0, 0xc1, 0x0c, 0x1c, 0x14, 0xc5, 0x51, 0x87, 0x56, 0xb4, 0x83, 0xce, 0x1c, 0x0c, 0x10, 0x00, 0x85, 0x07, 0x97, 0xc8, 0xf3, 0x4d, 0x26, 0x42,
0x99, 0x70, 0x44, 0xa0, 0x81, 0x06, 0x7e, 0x6a, 0xf0, 0x80, 0x02, 0x04, 0xca, 0x64, 0x26, 0x50, 0x65, 0x42, 0x21, 0x24, 0x03, 0x79, 0xd4, 0x93,
0x60, 0x71, 0x66, 0x2f, 0x89, 0x00, 0xb0, 0xd1, 0x03, 0x03, 0x48, 0x20, 0xc9, 0x92, 0x50, 0x7a, 0xb0, 0x4d, 0x03, 0x4c, 0x36, 0x69, 0x96, 0x5c,
0x43, 0x09, 0x06, 0x0a, 0xb0, 0x0c, 0x41, 0x26, 0xf5, 0xf2, 0x06, 0x04, 0x69, 0x20, 0xa0, 0x28, 0x02, 0x11, 0xe8, 0x50, 0x0f, 0x12, 0x9a, 0xc4,
0x1b, 0x8c, 0x50, 0x82, 0x0c, 0x48, 0xf8, 0x30, 0xe4, 0x06, 0x66, 0xb5, 0x13, 0x01, 0x0e, 0x8a, 0x46, 0x50, 0x0f, 0x02, 0x49, 0x30, 0xea, 0x28,
0x77, 0x11, 0x34, 0xa2, 0xe4, 0xc0, 0xa0, 0x0c, 0x3e, 0x70, 0x91, 0x05, 0x47, 0x3a, 0x44, 0xb0, 0xe8, 0x1c, 0xf5, 0x08, 0xa2, 0x28, 0xa5, 0x8a,
0x19, 0x67, 0x38, 0x81, 0x46, 0x17, 0xfe, 0x74, 0x64, 0xe3, 0x8a, 0x20, 0xa6, 0xb1, 0x69, 0x3d, 0x69, 0x64, 0xca, 0xa8, 0x37, 0x93, 0x2a, 0xa3,
0x82, 0xf8, 0xe1, 0x04, 0x94, 0x87, 0xf4, 0x82, 0x88, 0x11, 0x05, 0x30, 0xa9, 0x2a, 0xfe, 0x9e, 0x32, 0x4a, 0xcf, 0xa3, 0x6e, 0x48, 0x82, 0x03,
0x50, 0xc0, 0x0e, 0x6c, 0xe0, 0x01, 0x41, 0x03, 0x1b, 0xc4, 0x90, 0xce, 0x0e, 0x96, 0x7a, 0x4a, 0x69, 0x04, 0xc4, 0x88, 0x8a, 0x29, 0xa3, 0xf0,
0x7b, 0xba, 0xe2, 0x11, 0x03, 0xa8, 0x30, 0x9c, 0x59, 0x89, 0x0e, 0x0b, 0xd4, 0x13, 0x41, 0x12, 0x99, 0xce, 0xa1, 0x83, 0x2a, 0x73, 0x20, 0x40,
0xd2, 0x07, 0x43, 0x06, 0x76, 0x06, 0x70, 0x85, 0x36, 0xe5, 0x40, 0xe3, 0xaa, 0xa5, 0x54, 0x59, 0x51, 0x81, 0x08, 0x15, 0x98, 0x70, 0x42, 0x0c,
0x8a, 0x1b, 0x10, 0x44, 0x30, 0xc2, 0x08, 0x2c, 0x54, 0x91, 0x50, 0x04, 0x1c, 0x21, 0x11, 0xc3, 0x09, 0xd1, 0x8a, 0x70, 0x42, 0x3d, 0xd0, 0x86,
0x0a, 0x04, 0x20, 0x46, 0x25, 0x6c, 0x44, 0xd1, 0xa1, 0x00, 0x0a, 0x2c, 0x31, 0x6d, 0x47, 0x31, 0x58, 0xc1, 0x8b, 0x08, 0x22, 0xb0, 0x53, 0xcf,
0xb0, 0xc1, 0x0c, 0x30, 0xb0, 0xa9, 0x40, 0x1c, 0x03, 0xed, 0xe9, 0x0a, 0x17, 0x27, 0x40, 0xab, 0x48, 0x05, 0xb0, 0x30, 0xe3, 0x11, 0xba, 0xd9,
0x1e, 0x17, 0x40, 0xc0, 0xe0, 0x0e, 0x37, 0xd0, 0x40, 0x03, 0x0a, 0x21, 0x1a, 0x01, 0xad, 0x09, 0x68, 0x48, 0xc3, 0x91, 0xbc, 0x15, 0xd8, 0xc2,
0x80, 0x6a, 0x99, 0x64, 0x95, 0x7c, 0xc1, 0xe0, 0x06, 0x24, 0x10, 0xa1, 0x8a, 0x26, 0xf5, 0xc4, 0x20, 0x09, 0xb4, 0x96, 0x1a, 0x41, 0x6f, 0x05,
0x55, 0x10, 0x6e, 0xcc, 0xe1, 0x44, 0x1a, 0x6a, 0x68, 0x52, 0x89, 0x17, 0x15, 0x60, 0x6b, 0x82, 0x09, 0x61, 0x08, 0xf3, 0x05, 0x47, 0x06, 0xa3,
0x41, 0xb0, 0xe1, 0x47, 0x13, 0x3f, 0x94, 0xf0, 0x46, 0x14, 0x02, 0x8b, 0x61, 0x45, 0x0c, 0xd7, 0x22, 0x0c, 0xad, 0x11, 0x87, 0xde, 0x64, 0x05,
0xd0, 0x46, 0x10, 0x4f, 0x5c, 0x21, 0xc1, 0x04, 0x1b, 0xa0, 0x02, 0xd4, 0x0a, 0x28, 0x4c, 0x30, 0x81, 0x0a, 0x24, 0x74, 0xe4, 0xce, 0x0e, 0x13,
0xc4, 0x39, 0xac, 0x29, 0xc1, 0x22, 0x35, 0xe1, 0xa0, 0x2f, 0x07, 0x3f, 0x50, 0x40, 0xc1, 0x0e, 0xf5, 0x50, 0xa0, 0xf1, 0x0e, 0x24, 0x20, 0xf1,
0xe0, 0x70, 0xc2, 0x09, 0x29, 0xe0, 0x24, 0x40, 0x08, 0x6f, 0x8a, 0xc2, 0x28, 0x09, 0x2a, 0x88, 0x4c, 0xc1, 0x2a, 0xf5, 0x60, 0xb1, 0x83, 0xc9,
0x46, 0x08, 0x7e, 0xee, 0x30, 0x44, 0x10, 0x41, 0x78, 0x41, 0xc8, 0x05, 0x28, 0xd0, 0x41, 0x81, 0x24, 0x1d, 0x73, 0x44, 0x82, 0x24, 0xa7, 0x4c,
0xe4, 0x12, 0x10, 0x45, 0x60, 0x2b, 0x25, 0x00, 0x81, 0x05, 0x28, 0x0c, 0x90, 0x31, 0xcd, 0xab, 0x60, 0xc1, 0x51, 0x27, 0x3e, 0x53, 0x40, 0x4b,
0x91, 0xc5, 0x68, 0x0b, 0xbc, 0x60, 0x1a, 0x39, 0x35, 0xd9, 0xb0, 0xa0, 0x28, 0xc5, 0xc8, 0x6c, 0x32, 0xc5, 0x2a, 0x64, 0x5c, 0xb3, 0xc9, 0x23,
0x04, 0x2d, 0xe0, 0xc1, 0x86, 0x53, 0x1d, 0x74, 0x10, 0x82, 0x04, 0x10, 0x57, 0x13, 0x4a, 0xce, 0x2a, 0x84, 0x4c, 0x01, 0xc7, 0x2c, 0x53, 0x40,
0xb4, 0xf7, 0x8d, 0x2b, 0x6c, 0x7c, 0x50, 0x02, 0x93, 0x57, 0x08, 0xb2, 0x87, 0xc6, 0x2a, 0x54, 0x6c, 0x57, 0x27, 0x18, 0x60, 0xd0, 0x43, 0x0f,
0x35, 0x0d, 0x41, 0xb4, 0x71, 0x46, 0x17, 0x69, 0xd0, 0x31, 0xca, 0x1d, 0x41, 0xb0, 0xd0, 0x11, 0x0b, 0x5b, 0x0c, 0xd1, 0x03, 0x06, 0x41, 0xd4,
0x40, 0xbf, 0x01, 0xa5, 0x0f, 0x9e, 0x62, 0x28, 0x81, 0xfe, 0x22, 0x78, 0x83, 0xc1, 0x08, 0x23, 0x6c, 0x31, 0xc8, 0x39, 0xbb, 0xbc, 0x32, 0xc8,
0x68, 0x15, 0x85, 0x04, 0x19, 0x4c, 0xe0, 0x03, 0x39, 0xc8, 0xf4, 0xfd, 0x16, 0x23, 0x0c, 0x81, 0xc1, 0xfe, 0x2c, 0x2c, 0xb4, 0x02, 0xb7, 0xde,
0x02, 0xa8, 0x23, 0xf8, 0x32, 0xb1, 0x07, 0x0c, 0x6c, 0x50, 0x42, 0x18, 0x67, 0xb0, 0x6d, 0xf6, 0xd9, 0xe5, 0x58, 0x82, 0x81, 0x25, 0x79, 0x63,
0x5c, 0x9b, 0x90, 0x83, 0x4a, 0x01, 0x5c, 0x42, 0xb6, 0x10, 0x19, 0x8c, 0x60, 0xc8, 0xd9, 0x6a, 0x88, 0x3d, 0x42, 0x2c, 0x41, 0xb4, 0x01, 0x78,
0x10, 0x43, 0x1e, 0x78, 0x38, 0x45, 0x44, 0x0f, 0x23, 0x68, 0x00, 0x41, 0xd7, 0x8f, 0x84, 0xad, 0x37, 0xdb, 0x86, 0x2c, 0xb2, 0x88, 0x1a, 0x6a,
0x11, 0x50, 0x98, 0x40, 0x41, 0x00, 0x08, 0x14, 0x80, 0x41, 0x10, 0x26, 0x98, 0x3d, 0x4d, 0x2f, 0x23, 0xf4, 0x30, 0xce, 0x1b, 0x6f, 0xb4, 0xa1,
0x98, 0xf0, 0x84, 0x0f, 0xa0, 0x2a, 0xa0, 0x8e, 0x6d, 0x41, 0x3d, 0xe1, 0x4b, 0x0f, 0x67, 0x9c, 0xb1, 0x85, 0xd7, 0x76, 0x89, 0xc1, 0x48, 0x09,
0xc0, 0x02, 0x79, 0x29, 0x82, 0x12, 0x22, 0x5e, 0xd0, 0xd0, 0x81, 0x07, 0x25, 0xd4, 0x20, 0x44, 0x2a, 0x53, 0xf8, 0x20, 0x84, 0x06, 0x57, 0x94,
0x70, 0x0d, 0xb0, 0x03, 0x32, 0x82, 0x04, 0x81, 0x00, 0x91, 0x89, 0xa3, 0x70, 0x45, 0x0e, 0xf5, 0x20, 0x53, 0x43, 0x0d, 0x1a, 0x34, 0xf3, 0x4b,
0x29, 0x88, 0x53, 0x41, 0xf4, 0x01, 0xb7, 0x1a, 0xb0, 0x4c, 0xcc, 0x36, 0x36, 0xd1, 0x08, 0x51, 0x02, 0x17, 0x76, 0x20, 0x93, 0xca, 0xed, 0x45,
0x1c, 0x4c, 0x64, 0xbc, 0xc1, 0x06, 0x1c, 0x18, 0x02, 0x8d, 0xf4, 0x4f, 0x70, 0x51, 0x82, 0x1d, 0x76, 0xe0, 0x2e, 0x84, 0x0f, 0x1d, 0x4d, 0x91,
0xe8, 0xc0, 0x01, 0x83, 0xa6, 0x4c, 0x7c, 0x03, 0x09, 0x13, 0x48, 0xd0, 0x08, 0xf0, 0x5c, 0xd4, 0xb0, 0x7b, 0x5a, 0x3e, 0xe4, 0x50, 0x82, 0x06,
0x47, 0x2f, 0x77, 0xd0, 0x80, 0x40, 0x04, 0x24, 0xfc, 0x30, 0x0a, 0xef, 0x25, 0x14, 0x21, 0xbe, 0x06, 0x1a, 0xac, 0xde, 0xbd, 0x06, 0x45, 0xd4,
0xfe, 0x46, 0xa1, 0x92, 0x00, 0x71, 0x2c, 0x9f, 0x02, 0x93, 0x5b, 0xb8, 0x70, 0x88, 0x2b, 0xc1, 0x24, 0x92, 0x0b, 0xfa, 0x42, 0xd4, 0x93, 0xc3,
0x82, 0xc8, 0x17, 0x58, 0x54, 0x2f, 0xc3, 0x16, 0x97, 0x10, 0x85, 0x17, 0xeb, 0x1a, 0x1c, 0x32, 0xc5, 0x14, 0x62, 0x1c, 0x0f, 0x3c, 0xef, 0x2d,
0x4c, 0x87, 0x00, 0x01, 0xec, 0xa5, 0x6f, 0x26, 0x08, 0xc2, 0xd3, 0x30, 0x45, 0x02, 0xc1, 0x02, 0x0b, 0x20, 0xc3, 0x02, 0x38, 0xc0, 0x01, 0x2f,
0x00, 0x81, 0xd9, 0xa1, 0xa3, 0x17, 0x7d, 0x4b, 0x80, 0x02, 0x24, 0xf0, 0x08, 0x10, 0x02, 0xff, 0xbb, 0x43, 0x3d, 0x96, 0x00, 0xc0, 0x05, 0xfc,
0x82, 0x6f, 0xec, 0x09, 0x19, 0x4d, 0x31, 0xc1, 0x09, 0x44, 0x50, 0x94, 0x41, 0x1b, 0x5e, 0xf0, 0x02, 0x02, 0xff, 0xb7, 0x04, 0x30, 0x20, 0xf0,
0x1d, 0xb8, 0xc2, 0x0b, 0x6f, 0x81, 0x00, 0x04, 0xc6, 0x80, 0x11, 0x9a, 0x0f, 0x03, 0xe4, 0x00, 0x00, 0x31, 0x58, 0xc1, 0x8e, 0x80, 0xc1, 0x0b,
0x14, 0x8f, 0x06, 0x60, 0x80, 0x58, 0x1a, 0x68, 0x41, 0x3c, 0xe6, 0x59, 0x0b, 0xf8, 0x1f, 0x04, 0x96, 0x00, 0x97, 0x48, 0xdc, 0x21, 0x84, 0x22,
0x01, 0x08, 0x32, 0x00, 0xd5, 0x1e, 0x30, 0x02, 0x41, 0x7f, 0x49, 0x01, 0x04, 0x20, 0xef, 0xd8, 0xc0, 0x40, 0x11, 0xde, 0x41, 0x83, 0x64, 0x40,
0x54, 0x13, 0xc8, 0x42, 0xf1, 0x0e, 0x27, 0x81, 0x11, 0x28, 0x43, 0x7a, 0x20, 0x07, 0xea, 0xa1, 0xc1, 0xff, 0x71, 0x80, 0x0d, 0x6c, 0xd0, 0x60,
0xfe, 0x15, 0x90, 0x40, 0xfb, 0xb4, 0x41, 0x3c, 0xad, 0x40, 0x61, 0x7e, 0x03, 0x67, 0x98, 0x9e, 0x27, 0x6c, 0x80, 0x07, 0xfe, 0x1b, 0x78, 0x01,
0x55, 0x60, 0x43, 0x10, 0x58, 0x10, 0x03, 0x19, 0x2c, 0x42, 0x14, 0x79, 0x0f, 0x3a, 0xc0, 0x03, 0x67, 0x74, 0xe0, 0x87, 0x34, 0x48, 0x46, 0x3d,
0x50, 0xc2, 0x7d, 0x96, 0xc0, 0x07, 0x68, 0x64, 0x43, 0x80, 0x1a, 0x2c, 0xaa, 0x70, 0x84, 0x23, 0xd2, 0xa0, 0x03, 0x47, 0x38, 0x82, 0x03, 0xa6,
0xe0, 0x02, 0xf6, 0x20, 0x40, 0x7f, 0x61, 0x01, 0x06, 0x60, 0x63, 0x87, 0xe8, 0x87, 0x2a, 0xf4, 0xe1, 0x89, 0x2f, 0x58, 0x03, 0x37, 0xba, 0x51,
0x3b, 0xc6, 0xd6, 0x3b, 0x05, 0xe8, 0x8b, 0x07, 0xb3, 0x7b, 0x0f, 0xd9, 0x86, 0x17, 0xbc, 0xe0, 0x08, 0x1b, 0x78, 0x42, 0x3d, 0xa4, 0x30, 0xc6,
0x68, 0x70, 0x82, 0x10, 0x84, 0xad, 0x05, 0x42, 0x41, 0xc1, 0x02, 0x18, 0x35, 0x08, 0x91, 0x07, 0x6b, 0xf8, 0x0b, 0x2a, 0x9e, 0xd0, 0x07, 0x4a,
0x20, 0x81, 0x32, 0x3d, 0xa8, 0x76, 0x34, 0x88, 0x42, 0x17, 0xd6, 0xa0, 0x3c, 0x31, 0x88, 0x33, 0xe4, 0xc8, 0x13, 0x9c, 0xd8, 0x01, 0x1a, 0xfc,
0x06, 0x5a, 0x8c, 0x0d, 0x0f, 0xbe, 0xb3, 0xc1, 0xa3, 0x24, 0xa4, 0x8c, 0x30, 0x88, 0x65, 0xa8, 0x47, 0x1f, 0x8e, 0xf8, 0x0c, 0x42, 0x48, 0x41,
0x8b, 0xe0, 0xf1, 0x09, 0x2f, 0x20, 0x01, 0x09, 0x38, 0x10, 0x85, 0x1a, 0x0a, 0x84, 0x78, 0xc1, 0x06, 0x3a, 0xf0, 0x82, 0x3c, 0x3a, 0xa4, 0x1e,
0x70, 0x80, 0x03, 0x25, 0xe8, 0x43, 0xed, 0x4c, 0x80, 0x03, 0x21, 0xce, 0x85, 0x70, 0x00, 0x0c, 0xa6, 0x28, 0x0e, 0x07, 0x8c, 0x62, 0x8a, 0x0e,
0x20, 0x18, 0x57, 0x74, 0x0a, 0x0e, 0x0a, 0x50, 0x00, 0x01, 0x80, 0x81, 0x20, 0x82, 0x0b, 0xea, 0x61, 0x06, 0x17, 0x68, 0x41, 0x91, 0x90, 0x9c,
0x62, 0x22, 0x68, 0x52, 0x19, 0xe4, 0x70, 0x2b, 0x27, 0x94, 0xe1, 0x12, 0xa2, 0x16, 0xaa, 0x00, 0x0d, 0x22, 0x60, 0xd2, 0x05, 0x2d, 0x68, 0x81,
0xd9, 0xb0, 0x50, 0x17, 0x6b, 0xa0, 0x12, 0x08, 0x1c, 0xc2, 0x17, 0x80, 0x0b, 0xa6, 0x08, 0x03, 0x2d, 0xa4, 0xa3, 0x1e, 0x2d, 0x40, 0xa5, 0x27,
0xa4, 0x01, 0x16, 0x48, 0x90, 0x81, 0x06, 0x8e, 0x51, 0x14, 0x4e, 0x79, 0x61, 0x40, 0x85, 0x49, 0xfe, 0x85, 0x23, 0x95, 0x74, 0x00, 0x15, 0x1c,
0x00, 0xe0, 0x46, 0xb0, 0x9f, 0x07, 0x15, 0x91, 0x06, 0x1b, 0xa8, 0xa5, 0xe0, 0x07, 0x8f, 0x14, 0xc2, 0x0f, 0x7b, 0xa0, 0xc2, 0x23, 0x1d, 0xb0,
0x0b, 0xb2, 0x72, 0x82, 0xca, 0x48, 0x00, 0x09, 0x53, 0x5b, 0x23, 0x15, 0x07, 0x49, 0xd6, 0x83, 0x08, 0x7b, 0x50, 0xa4, 0x16, 0x42, 0x79, 0x49,
0xba, 0xc0, 0x4c, 0x66, 0x48, 0x86, 0x98, 0x48, 0x80, 0xe1, 0x06, 0x1a, 0x2a, 0x2c, 0x92, 0x08, 0xac, 0xbb, 0x89, 0x12, 0x52, 0x90, 0x01, 0x10,
0xd0, 0x83, 0x63, 0x51, 0x2d, 0x96, 0x37, 0xc4, 0xde, 0x0a, 0x54, 0x80, 0x5c, 0x00, 0x11, 0xce, 0x04, 0x41, 0x06, 0x52, 0xa0, 0x84, 0x10, 0xc0,
0xbd, 0x0d, 0x48, 0x03, 0x8f, 0x43, 0x10, 0xe2, 0x0f, 0xcc, 0x10, 0xbd, 0x21, 0x0a, 0x21, 0xa8, 0x42, 0x17, 0x2e, 0xc0, 0xcd, 0x0b, 0x6c, 0x22,
0x27, 0xdc, 0x20, 0x03, 0x0a, 0x28, 0xc0, 0x02, 0x06, 0xe1, 0x94, 0x22, 0x03, 0x55, 0x88, 0x02, 0x1c, 0x94, 0xd0, 0x05, 0x69, 0x2a, 0x21, 0x0a,
0xd4, 0x87, 0x0b, 0x50, 0x72, 0xc2, 0x2b, 0xc9, 0x71, 0x1a, 0x32, 0xd2, 0x51, 0xd0, 0xa6, 0x34, 0xd3, 0x11, 0x82, 0x7a, 0xc0, 0xa1, 0x1e, 0x21,
0xc0, 0x06, 0xe9, 0xfe, 0x5c, 0xc0, 0x22, 0x7e, 0x39, 0x4b, 0xb8, 0xcc, 0xc8, 0x40, 0x1d, 0x10, 0x91, 0x01, 0xbd, 0x84, 0xc0, 0x1a, 0xed, 0xfe,
0xee, 0x1b, 0x42, 0xa1, 0x41, 0x0a, 0x32, 0x40, 0xd0, 0x49, 0xb1, 0x43, 0xe4, 0x88, 0x12, 0x32, 0xc0, 0x4d, 0x22, 0x1c, 0xa3, 0x23, 0xd9, 0xec,
0x32, 0x82, 0x10, 0x68, 0x06, 0xd8, 0xb4, 0x03, 0xb2, 0xb8, 0x80, 0x41, 0x42, 0x1d, 0xb8, 0x29, 0xcd, 0x8e, 0xf0, 0xd3, 0x9b, 0x19, 0x08, 0x41,
0x24, 0xd8, 0x86, 0x40, 0xec, 0xb9, 0x05, 0x66, 0xa2, 0xc1, 0x1c, 0xcf, 0x3c, 0x2f, 0x50, 0x07, 0x67, 0xd6, 0xb3, 0x25, 0xf5, 0xf8, 0x84, 0x01,
0x7c, 0x82, 0x11, 0x96, 0x10, 0xa4, 0x35, 0x4d, 0x80, 0x0c, 0x0f, 0x62, 0x26, 0x4a, 0xd1, 0x8a, 0x1a, 0xe0, 0x00, 0x18, 0xcd, 0xa8, 0x45, 0x33,
0x8a, 0x53, 0x9e, 0x30, 0x82, 0x0d, 0x2c, 0x09, 0x7b, 0x13, 0x18, 0xc3, 0xca, 0x51, 0x8a, 0x76, 0x74, 0xa2, 0x18, 0xfd, 0x44, 0x3d, 0xb2, 0x00,
0x4c, 0xd6, 0x18, 0x04, 0x2b, 0x38, 0x6e, 0x06, 0x40, 0x40, 0xc2, 0xe1, 0x8c, 0x1b, 0xdc, 0x80, 0x1c, 0xf5, 0xc0, 0xe8, 0x45, 0x0f, 0x30, 0xd2,
0x20, 0x60, 0x00, 0x05, 0x5c, 0x22, 0x2b, 0x94, 0xc4, 0x8f, 0x7d, 0xe6, 0x1b, 0x64, 0x61, 0x1d, 0xe1, 0xa0, 0x46, 0x16, 0x4c, 0x7a, 0x83, 0x7a,
0xf0, 0x8a, 0x6c, 0xd0, 0xb3, 0x9e, 0x1f, 0xa4, 0x81, 0x10, 0xbe, 0xc4, 0x72, 0xf4, 0x00, 0x16, 0x5d, 0x29, 0x4e, 0x2b, 0xaa, 0x52, 0x9e, 0x7a,
0x08, 0x68, 0x9c, 0xd0, 0x08, 0x23, 0x10, 0xa1, 0x18, 0xc9, 0xd1, 0x45, 0xad, 0x1e, 0x8e, 0x08, 0x80, 0x00, 0x86, 0x4a, 0xd4, 0xa2, 0x1a, 0xf5,
0x1b, 0x2c, 0x74, 0x03, 0x3d, 0x28, 0x07, 0xb2, 0xda, 0x60, 0x83, 0x92, 0xa8, 0x48, 0x4d, 0xea, 0x51, 0x03, 0x50, 0x8f, 0x40, 0xe0, 0x01, 0x0f,
0xc2, 0x65, 0x07, 0x01, 0xc5, 0x81, 0x22, 0x65, 0x50, 0x86, 0x72, 0x98, 0x4e, 0xa8, 0x87, 0x51, 0x99, 0xea, 0x04, 0x40, 0x38, 0x21, 0x10, 0xb2,
0x44, 0x28, 0x56, 0xc0, 0x92, 0x1a, 0x38, 0xb1, 0x52, 0x3c, 0x50, 0xe1, 0x08, 0x84, 0x13, 0xa0, 0x0a, 0x88, 0x7a, 0x2a, 0xf5, 0xab, 0x4b, 0x85,
0x56, 0x4b, 0x38, 0xc2, 0x16, 0x1c, 0xc7, 0x81, 0x4c, 0xb0, 0x83, 0x26, 0x04, 0x60, 0x12, 0xc2, 0x11, 0x48, 0x04, 0xe0, 0xac, 0x68, 0x4d, 0xab,
0x6c, 0x60, 0x23, 0x0e, 0x48, 0x36, 0x01, 0x92, 0x6d, 0x60, 0x19, 0xed, 0x5a, 0xd7, 0xca, 0xd6, 0xb6, 0xae, 0xb5, 0x1e, 0x9c, 0x10, 0x05, 0x36,
0x28, 0x47, 0x0b, 0x69, 0xf0, 0x84, 0x22, 0xf4, 0xe8, 0x51, 0xdf, 0x33, 0x26, 0x81, 0x8e, 0x7a, 0xbc, 0xb5, 0x09, 0xa2, 0x98, 0x47, 0x13, 0xf6,
0x4b, 0x29, 0x26, 0x79, 0x82, 0x24, 0x70, 0xe1, 0x0c, 0x65, 0x80, 0xc6, 0x0a, 0x0e, 0x75, 0x4c, 0xa2, 0x09, 0x9c, 0xb0, 0xab, 0x5b, 0x07, 0xcb,
0x37, 0xc8, 0x81, 0x8e, 0xd3, 0xa0, 0x02, 0x13, 0x4d, 0x2d, 0xca, 0x02, 0x56, 0x47, 0xfc, 0xf4, 0x95, 0x88, 0x4d, 0xac, 0x62, 0x39, 0x62, 0x03,
0x1a, 0x61, 0x54, 0xad, 0xe8, 0x40, 0x60, 0xb3, 0x23, 0x5c, 0x2c, 0x5d, 0x09, 0x38, 0xd6, 0x1c, 0x7f, 0x49, 0x81, 0x63, 0x27, 0x3b, 0xd9, 0x14,
0x60, 0x55, 0x1f, 0x98, 0xc2, 0x17, 0x89, 0x98, 0x02, 0x06, 0xbe, 0x75, 0x2c, 0xf6, 0xb2, 0x7b, 0x39, 0x8b, 0x5d, 0x24, 0x2b, 0x01, 0x1b, 0x98,
0xbd, 0x23, 0x04, 0x55, 0x08, 0x89, 0x64, 0x92, 0x19, 0x50, 0x71, 0x89, 0xa5, 0x1e, 0x29, 0x68, 0xec, 0x64, 0x6d, 0x60, 0x59, 0xcd, 0xf2, 0x04,
0x37, 0x64, 0x81, 0x09, 0xae, 0x4a, 0xfe, 0xc3, 0x34, 0x08, 0x27, 0x88, 0xb4, 0xa4, 0x3d, 0x14, 0x47, 0x42, 0x9b, 0xda, 0x64, 0x9a, 0x16, 0x23,
0x2f, 0x38, 0x81, 0x99, 0x4b, 0x10, 0x42, 0x1b, 0x62, 0x18, 0x03, 0x0e, 0x7a, 0x88, 0x2d, 0x2d, 0x44, 0xc7, 0xfa, 0xda, 0xda, 0xda, 0xf6, 0xb6,
0x48, 0xe3, 0x99, 0xac, 0x3b, 0x41, 0x8f, 0x38, 0x30, 0x81, 0x12, 0x24, 0xb8, 0xcd, 0xad, 0x6e, 0x77, 0xcb, 0xdb, 0xde, 0xfa, 0xf6, 0xb7, 0xc0,
0xc1, 0x4c, 0x64, 0x5b, 0x18, 0xc2, 0xce, 0x26, 0xb0, 0x01, 0xf0, 0x81, 0x0d, 0xae, 0x70, 0x87, 0x4b, 0xdc, 0xe2, 0x1a, 0xf7, 0xb8, 0xc8, 0x4d,
0x8c, 0xad, 0x33, 0x02, 0x96, 0x9a, 0xa0, 0x09, 0x6d, 0x64, 0x23, 0x1a, 0xae, 0x72, 0x97, 0xcb, 0xdc, 0xe6, 0x3a, 0xf7, 0xb9, 0x53, 0x09, 0x08,
0xca, 0x80, 0x04, 0x13, 0xb8, 0x30, 0x8a, 0xde, 0x0d, 0x75, 0x00, 0x05, 0x00, 0x3b
0xa0, 0xec, 0x09, 0x75, 0x20, 0x01, 0xb0, 0x39, 0x50, 0xa4, 0x34, 0xc0,
0xc1, 0x08, 0x14, 0xb9, 0x5e, 0x84, 0x2d, 0x52, 0x91, 0x24, 0x88, 0x81,
0x16, 0x7e, 0x29, 0x05, 0x12, 0xc0, 0x94, 0x09, 0x5d, 0x40, 0x03, 0x80,
0xcc, 0x80, 0xa5, 0x4d, 0x90, 0x63, 0x7b, 0x51, 0xe0, 0x82, 0x7e, 0xbb,
0x10, 0x06, 0xb6, 0x89, 0x01, 0x08, 0x68, 0x90, 0x41, 0x0c, 0xc4, 0x31,
0x36, 0x36, 0x98, 0xa0, 0x03, 0x20, 0x60, 0x6e, 0x09, 0x64, 0x51, 0xaf,
0xed, 0xf5, 0x2e, 0x05, 0x23, 0x58, 0x81, 0x07, 0x50, 0xa0, 0x82, 0x5a,
0x72, 0xb2, 0x14, 0x45, 0x34, 0x81, 0x10, 0xe0, 0xc9, 0x85, 0x2e, 0xa8,
0x81, 0x0e, 0x5c, 0x60, 0xc2, 0x76, 0x65, 0x50, 0x08, 0xef, 0xa6, 0x53,
0x01, 0x45, 0x1d, 0x6f, 0x2d, 0x6d, 0x39, 0x13, 0x08, 0xfa, 0x0d, 0x06,
0xf0, 0x25, 0x99, 0x22, 0x79, 0x80, 0x63, 0x12, 0x6c, 0xa1, 0xc1, 0x5a,
0xc1, 0x41, 0x12, 0x96, 0x60, 0xd1, 0x34, 0xa0, 0x01, 0x4b, 0x9a, 0xc8,
0x19, 0x1b, 0xb4, 0x90, 0x86, 0x34, 0x74, 0xc1, 0x11, 0xcb, 0xe3, 0xeb,
0x0e, 0x0e, 0x56, 0x06, 0x74, 0x14, 0xb1, 0x03, 0x27, 0x28, 0x01, 0x07,
0x30, 0xe0, 0x83, 0xd9, 0x99, 0xa9, 0x26, 0x78, 0xf8, 0x42, 0x1b, 0x28,
0x66, 0x02, 0x1a, 0x7c, 0x61, 0x04, 0x45, 0xe1, 0xc1, 0xfe, 0x15, 0x7b,
0x87, 0xc2, 0x2d, 0x60, 0x09, 0x40, 0x4e, 0x48, 0x31, 0x13, 0xca, 0xa0,
0x08, 0xef, 0x1a, 0x08, 0x02, 0xe2, 0xd5, 0x0a, 0x0b, 0x82, 0x89, 0x81,
0x75, 0xf0, 0xe7, 0x8a, 0x4a, 0xbc, 0xe7, 0x0a, 0x60, 0xf0, 0x3d, 0x0c,
0x94, 0x60, 0x05, 0x35, 0x90, 0x81, 0xa2, 0xfd, 0x40, 0x30, 0x25, 0x02,
0xad, 0x08, 0x5c, 0x00, 0x44, 0x1d, 0xd2, 0xd0, 0x84, 0x3e, 0x00, 0x83,
0x45, 0x2d, 0x94, 0x42, 0x16, 0xd4, 0x00, 0x88, 0x68, 0xd4, 0x64, 0x28,
0x82, 0x50, 0xf4, 0x23, 0xc4, 0x71, 0x32, 0xd6, 0xa5, 0x40, 0xcb, 0x13,
0xd0, 0x04, 0x41, 0x46, 0xd5, 0x0b, 0x52, 0xf4, 0xa2, 0x17, 0xa2, 0x88,
0xf2, 0x13, 0xc2, 0x00, 0x95, 0x0d, 0x80, 0x83, 0x29, 0x14, 0x0b, 0xc2,
0x10, 0xb0, 0xe0, 0x2a, 0xb4, 0x72, 0x21, 0x13, 0xda, 0x58, 0xe3, 0x10,
0x8a, 0x22, 0x01, 0xf1, 0x0a, 0x21, 0x08, 0x3a, 0x58, 0x68, 0x06, 0xbc,
0x1c, 0xd2, 0x59, 0x79, 0x61, 0x28, 0x42, 0xc0, 0x01, 0x11, 0xa8, 0xf0,
0x05, 0x2f, 0xb0, 0x81, 0x10, 0xaf, 0x20, 0x47, 0x3b, 0x46, 0xe5, 0x6c,
0x68, 0x4f, 0x21, 0x0e, 0x7a, 0x18, 0x85, 0x4f, 0xdf, 0xb3, 0x3d, 0x3c,
0xdc, 0xa1, 0x12, 0xbf, 0xa0, 0x92, 0xac, 0xd4, 0x36, 0x08, 0x52, 0x44,
0x23, 0x8d, 0x93, 0xe4, 0xc1, 0x90, 0x48, 0x30, 0x1d, 0x4a, 0xc1, 0x67,
0xb1, 0x6f, 0xba, 0x17, 0xd0, 0xc0, 0x90, 0x97, 0x11, 0x6c, 0x83, 0x70,
0x95, 0xc0, 0x43, 0xae, 0xa1, 0x60, 0x85, 0x2c, 0xc4, 0x81, 0x11, 0xd1,
0xc0, 0x88, 0xb3, 0xdb, 0x10, 0x07, 0x4c, 0x28, 0x23, 0x1c, 0x41, 0x61,
0x83, 0x17, 0xc4, 0xb0, 0x08, 0x60, 0x7c, 0xe7, 0x27, 0x55, 0x12, 0x05,
0x22, 0x68, 0x85, 0x08, 0x51, 0xb8, 0x42, 0x14, 0x95, 0x10, 0x45, 0x2f,
0xfe, 0xb2, 0xd1, 0xd8, 0x15, 0x65, 0x03, 0x4d, 0x88, 0xd8, 0x78, 0xc7,
0x91, 0x31, 0x6e, 0x43, 0xc2, 0xda, 0x15, 0xc8, 0xb0, 0xe0, 0x7b, 0x64,
0xe5, 0x0a, 0x57, 0x44, 0xe3, 0xa7, 0x19, 0xbd, 0x81, 0x0c, 0x66, 0x50,
0x02, 0x48, 0xb0, 0xa3, 0x1d, 0x18, 0xc7, 0x88, 0x3a, 0x32, 0x31, 0x0d,
0xe0, 0xd2, 0xa0, 0x08, 0xc8, 0x13, 0x07, 0x46, 0xb4, 0x55, 0x09, 0x41,
0xe0, 0x01, 0x0f, 0x82, 0xb0, 0xc4, 0xc8, 0x19, 0xfb, 0x5f, 0x8d, 0x8b,
0x02, 0x19, 0xf4, 0xb4, 0x57, 0x25, 0x2a, 0xe1, 0x8a, 0x6f, 0x30, 0xfb,
0x48, 0xe4, 0xf0, 0x86, 0x31, 0x8a, 0xc1, 0x0b, 0x5e, 0xec, 0x82, 0x17,
0xc5, 0x28, 0xc6, 0xd8, 0x8b, 0xe1, 0x8c, 0x67, 0x5c, 0xe3, 0xed, 0x6f,
0x7f, 0x86, 0x31, 0x8c, 0x61, 0xf6, 0x5d, 0xa4, 0xdd, 0x19, 0xd6, 0xb8,
0x46, 0xde, 0xad, 0xf1, 0x8c, 0x63, 0xa8, 0x1d, 0xef, 0x7b, 0x97, 0xfb,
0xdc, 0xf1, 0x0e, 0x77, 0x5e, 0xd0, 0x8d, 0x07, 0x40, 0xf8, 0xc1, 0x0c,
0xa4, 0x41, 0x0e, 0xbd, 0x57, 0xe3, 0xf1, 0xdd, 0xb0, 0xa2, 0x29, 0x8c,
0x2b, 0x8d, 0x22, 0xde, 0xc0, 0x53, 0x25, 0x58, 0x02, 0x39, 0xb0, 0x41,
0x0c, 0x62, 0xe8, 0xa2, 0x15, 0xac, 0x08, 0x3d, 0x2b, 0x5a, 0x31, 0x8c,
0xce, 0x37, 0xc3, 0xf3, 0xad, 0x48, 0x7d, 0xe9, 0x4f, 0xaf, 0x8b, 0xcf,
0x93, 0xbe, 0x19, 0xd4, 0xb0, 0x06, 0xd0, 0x6d, 0xf3, 0xa6, 0x5e, 0xe8,
0xe2, 0x16, 0xb7, 0x48, 0x05, 0xee, 0x77, 0xbf, 0x7b, 0xdd, 0xf3, 0x1e,
0xf7, 0xb6, 0xe0, 0x7d, 0xf0, 0x6d, 0x11, 0xfc, 0xdd, 0x0f, 0xdf, 0xf8,
0xb7, 0x20, 0xfe, 0xf1, 0x81, 0x8f, 0x8b, 0x27, 0x0c, 0x01, 0x08, 0x30,
0x2d, 0x03, 0x32, 0x8c, 0x41, 0xfc, 0x54, 0xd8, 0x22, 0x15, 0xc2, 0xa8,
0x44, 0x21, 0x7e, 0xfe, 0x34, 0x03, 0x19, 0x64, 0x21, 0x0c, 0x3a, 0xe0,
0xfe, 0x0f, 0x58, 0x76, 0xfd, 0x54, 0x98, 0xff, 0xfc, 0xe8, 0x37, 0xbf,
0x27, 0xd0, 0xef, 0x89, 0xf6, 0xbb, 0xff, 0xfd, 0x9e, 0xe8, 0x44, 0x2e,
0xce, 0xf1, 0x20, 0x9a, 0x80, 0x7c, 0x12, 0x91, 0xf8, 0x84, 0xfe, 0xf3,
0xff, 0x89, 0xfc, 0x47, 0x42, 0x15, 0xfd, 0x07, 0x80, 0xfe, 0x07, 0x80,
0xfb, 0xb7, 0x0a, 0x91, 0x60, 0x80, 0xab, 0x00, 0x0a, 0x0a, 0xb8, 0x80,
0x0c, 0xd8, 0x80, 0xa0, 0xc0, 0x0a, 0xad, 0xd7, 0x0a, 0x81, 0xa0, 0x40,
0x5d, 0x00, 0x25, 0x8a, 0x50, 0x09, 0xa1, 0x00, 0x0a, 0xad, 0xa0, 0x0b,
0x9e, 0x07, 0x0a, 0x76, 0xc0, 0x06, 0x5c, 0x90, 0x78, 0x42, 0x12, 0x24,
0xe6, 0x01, 0x04, 0x5c, 0x60, 0x09, 0x94, 0x10, 0x09, 0x0a, 0x28, 0x09,
0xa0, 0x10, 0x09, 0x91, 0x20, 0x09, 0x2a, 0xf8, 0x82, 0x32, 0x08, 0x83,
0x30, 0x38, 0x83, 0x92, 0x70, 0x83, 0x1a, 0xc8, 0x0b, 0xcf, 0xc0, 0x0d,
0xd7, 0x30, 0x0e, 0xb6, 0xa1, 0x23, 0xae, 0x50, 0x09, 0x88, 0xb0, 0x75,
0x89, 0xb0, 0x75, 0x5b, 0x37, 0x84, 0x46, 0x58, 0x09, 0x45, 0x68, 0x84,
0x4b, 0x98, 0x84, 0x44, 0x28, 0x84, 0x50, 0x58, 0x84, 0x43, 0x38, 0x84,
0x52, 0x58, 0x84, 0x22, 0xd7, 0x0b, 0x13, 0x33, 0x04, 0x50, 0xd2, 0x04,
0x73, 0x00, 0x6b, 0x56, 0xd8, 0x0b, 0xd0, 0x80, 0x0c, 0x13, 0x13, 0x04,
0x42, 0x90, 0x05, 0x4d, 0x00, 0x7d, 0x4b, 0xb0, 0x85, 0x3c, 0x05, 0x72,
0x4e, 0xd8, 0x86, 0x6e, 0xc8, 0x86, 0x4e, 0xe8, 0x71, 0x31, 0xd7, 0x4b,
0xfc, 0xf1, 0x26, 0xd0, 0x10, 0x86, 0xc8, 0x90, 0x87, 0x7a, 0x88, 0x87,
0x7a, 0xd8, 0x87, 0x79, 0x18, 0x86, 0x80, 0x88, 0x0c, 0x81, 0x18, 0x86,
0xc9, 0x80, 0x87, 0x84, 0x68, 0x88, 0xbf, 0x82, 0x78, 0x87, 0xba, 0xf2,
0x04, 0x60, 0x50, 0x06, 0x73, 0xd0, 0x05, 0xc0, 0x90, 0x0d, 0x77, 0x78,
0x87, 0xda, 0xf0, 0x0d, 0x27, 0x21, 0x08, 0xb9, 0x86, 0x03, 0x47, 0x90,
0x86, 0x4d, 0xe0, 0x07, 0xb2, 0x60, 0x89, 0x92, 0x38, 0x89, 0xa2, 0x38,
0x8a, 0xa4, 0x58, 0x8a, 0x77, 0x98, 0x0d, 0x8b, 0xf5, 0x75, 0x47, 0x82,
0x0e, 0xac, 0xd8, 0x8a, 0xae, 0xf8, 0x8a, 0xb0, 0x18, 0x8b, 0xb2, 0x38,
0x8b, 0xac, 0x58, 0x75, 0xb4, 0x22, 0x0a, 0x24, 0x77, 0x1a, 0xaf, 0x78,
0x11, 0x34, 0xd1, 0x74, 0x12, 0x17, 0x2c, 0x95, 0x30, 0x72, 0xac, 0x78,
0x11, 0xb0, 0x48, 0x8c, 0xc6, 0x38, 0x8c, 0x8d, 0x95, 0x8c, 0xe9, 0x90,
0x8c, 0x17, 0xd1, 0x8c, 0xaa, 0xb8, 0x6a, 0x03, 0xd1, 0x0e, 0x62, 0x34,
0x7b, 0x11, 0xf1, 0x8c, 0x32, 0xf1, 0x5f, 0x79, 0x38, 0x6e, 0x9a, 0x31,
0x73, 0x68, 0x52, 0x73, 0x82, 0xc8, 0x58, 0xd4, 0x98, 0x19, 0x69, 0x71,
0x11, 0x2c, 0x82, 0x0e, 0xe1, 0xb8, 0x1b, 0xb5, 0x58, 0x8e, 0x8d, 0x25,
0x8e, 0xec, 0xd8, 0x8e, 0xee, 0xf8, 0x8e, 0xf0, 0x18, 0x8f, 0xf2, 0x38,
0x8f, 0xf4, 0x58, 0x8f, 0xf6, 0x78, 0x8f, 0xf8, 0x98, 0x8f, 0xfa, 0xb8,
0x8f, 0xfc, 0xd8, 0x8f, 0xfe, 0xf8, 0x8f, 0x00, 0x19, 0x90, 0x02, 0x39,
0x90, 0x04, 0xb9, 0x8f, 0x01, 0x01, 0x00, 0x3b
}; };
const unsigned int logo_len = 3536; const unsigned int logo_len = 2378;
unsigned char search_data[] = { unsigned char search_data[] = {
0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x78, 0x00, 0x1a, 0x00, 0xe7, 0x00, 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x78, 0x00, 0x1a, 0x00, 0xe7, 0x00,
......
...@@ -225,12 +225,13 @@ static void writeTemplatePrefix(OutputList &ol,ArgumentList *al,bool br=TRUE) ...@@ -225,12 +225,13 @@ static void writeTemplatePrefix(OutputList &ol,ArgumentList *al,bool br=TRUE)
* all types. * all types.
*/ */
MemberDef::MemberDef(const char *t,const char *na,const char *a,const char *e, MemberDef::MemberDef(const char *df,int dl,
const char *t,const char *na,const char *a,const char *e,
Protection p,Specifier v,bool s,bool r,MemberType mt, Protection p,Specifier v,bool s,bool r,MemberType mt,
const ArgumentList *tal,const ArgumentList *al const ArgumentList *tal,const ArgumentList *al
) : Definition(substituteClassNames(na)) ) : Definition(df,dl,substituteClassNames(na))
{ {
//printf("++++++ MemberDef(%s,%s,%s) ++++++ \n",t,na,a); //printf("++++++ MemberDef(%s file=%s,line=%d) ++++++ \n",na,df,dl);
classDef=0; classDef=0;
fileDef=0; fileDef=0;
fileDec=0; fileDec=0;
...@@ -251,7 +252,6 @@ MemberDef::MemberDef(const char *t,const char *na,const char *a,const char *e, ...@@ -251,7 +252,6 @@ MemberDef::MemberDef(const char *t,const char *na,const char *a,const char *e,
args=substituteClassNames(a); args=substituteClassNames(a);
if (type.isNull()) decl=name()+args; else decl=type+" "+name()+args; if (type.isNull()) decl=name()+args; else decl=type+" "+name()+args;
declLine=0; declLine=0;
defLine=0;
memberGroup=0; memberGroup=0;
virt=v; virt=v;
prot=p; prot=p;
...@@ -395,8 +395,10 @@ QCString MemberDef::getOutputFileBase() const ...@@ -395,8 +395,10 @@ QCString MemberDef::getOutputFileBase() const
{ {
return nspace->getOutputFileBase(); return nspace->getOutputFileBase();
} }
warn("Warning: Internal inconsistency: member %s does not belong to any\n" warn(defFileName,defLine,
" container!\n",name().data()); "Warning: Internal inconsistency: member %s does not belong to any"
" container!",name().data()
);
return "dummy"; return "dummy";
} }
...@@ -773,7 +775,7 @@ void MemberDef::writeDeclaration(OutputList &ol, ...@@ -773,7 +775,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
if (!briefDescription().isEmpty() && Config::briefMemDescFlag && !annMemb) if (!briefDescription().isEmpty() && Config::briefMemDescFlag && !annMemb)
{ {
ol.startMemberDescription(); ol.startMemberDescription();
parseDoc(ol,cname,name(),briefDescription()); parseDoc(ol,defFileName,defLine,cname,name(),briefDescription());
if (/*!documentation().isEmpty()*/ detailsAreVisible()) if (/*!documentation().isEmpty()*/ detailsAreVisible())
{ {
ol.disableAllBut(OutputGenerator::Html); ol.disableAllBut(OutputGenerator::Html);
...@@ -1044,14 +1046,14 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1044,14 +1046,14 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
) /* || !annMemb */ ) /* || !annMemb */
) )
{ {
parseDoc(ol,scopeName,name(),briefDescription()); parseDoc(ol,defFileName,defLine,scopeName,name(),briefDescription());
ol.newParagraph(); ol.newParagraph();
} }
/* write detailed description */ /* write detailed description */
if (!documentation().isEmpty()) if (!documentation().isEmpty())
{ {
parseDoc(ol,scopeName,name(),documentation()+"\n"); parseDoc(ol,defFileName,defLine,scopeName,name(),documentation()+"\n");
ol.pushGeneratorState(); ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::RTF); ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph(); ol.newParagraph();
...@@ -1083,7 +1085,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1083,7 +1085,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
ol.endEmphasis(); ol.endEmphasis();
ol.endDescTableTitle(); ol.endDescTableTitle();
ol.startDescTableData(); ol.startDescTableData();
parseDoc(ol,scopeName,name(),a->docs); parseDoc(ol,defFileName,defLine,scopeName,name(),a->docs);
ol.endDescTableData(); ol.endDescTableData();
} }
} }
...@@ -1138,7 +1140,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1138,7 +1140,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if (!fmd->briefDescription().isEmpty()) if (!fmd->briefDescription().isEmpty())
{ {
parseDoc(ol,scopeName,fmd->name(),fmd->briefDescription()); parseDoc(ol,defFileName,defLine,scopeName,fmd->name(),fmd->briefDescription());
//ol.newParagraph(); //ol.newParagraph();
} }
if (!fmd->briefDescription().isEmpty() && if (!fmd->briefDescription().isEmpty() &&
...@@ -1148,7 +1150,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ...@@ -1148,7 +1150,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
} }
if (!fmd->documentation().isEmpty()) if (!fmd->documentation().isEmpty())
{ {
parseDoc(ol,scopeName,fmd->name(),fmd->documentation()+"\n"); parseDoc(ol,defFileName,defLine,scopeName,fmd->name(),fmd->documentation()+"\n");
} }
ol.endDescTableData(); ol.endDescTableData();
} }
...@@ -1329,7 +1331,7 @@ void MemberDef::warnIfUndocumented() ...@@ -1329,7 +1331,7 @@ void MemberDef::warnIfUndocumented()
t="group", d=gd; t="group", d=gd;
if (d && d->isLinkable() && !isLinkable() && name().find('@')==-1) if (d && d->isLinkable() && !isLinkable() && name().find('@')==-1)
warn("Warning: Member %s of %s %s is not documented\n", warn_undoc(defFileName,defLine,"Warning: Member %s of %s %s is not documented.",
name().data(),t,d->name().data()); name().data(),t,d->name().data());
} }
......
...@@ -59,7 +59,8 @@ class MemberDef : public Definition ...@@ -59,7 +59,8 @@ class MemberDef : public Definition
// initialization // initialization
}; };
MemberDef(const char *type,const char *name,const char *args, MemberDef(const char *defFileName,int defLine,
const char *type,const char *name,const char *args,
const char *excp,Protection prot,Specifier virt,bool stat, const char *excp,Protection prot,Specifier virt,bool stat,
bool related,MemberType t,const ArgumentList *tal, bool related,MemberType t,const ArgumentList *tal,
const ArgumentList *al); const ArgumentList *al);
...@@ -96,8 +97,8 @@ class MemberDef : public Definition ...@@ -96,8 +97,8 @@ class MemberDef : public Definition
MemberList *getSectionList() const { return section; } MemberList *getSectionList() const { return section; }
void setMemberType(MemberType t) { mtype=t; } void setMemberType(MemberType t) { mtype=t; }
void setDefinition(const char *d) { def=d; } void setDefinition(const char *d) { def=d; }
void setDefFile(const char *f) { defFile=f; } //void setDefFile(const char *f) { defFile=f; }
void setDefLine(int l) { defLine=l; } //void setDefLine(int l) { defLine=l; }
void setFileDef(FileDef *fd) { fileDef=fd; } void setFileDef(FileDef *fd) { fileDef=fd; }
void setFileDec(FileDef *fd) { fileDec=fd; } void setFileDec(FileDef *fd) { fileDec=fd; }
void setAnchor(const char *a) { anc=a; } void setAnchor(const char *a) { anc=a; }
...@@ -143,10 +144,8 @@ class MemberDef : public Definition ...@@ -143,10 +144,8 @@ class MemberDef : public Definition
ExampleList *getExampleList() const { return exampleList; } ExampleList *getExampleList() const { return exampleList; }
// prototype related members // prototype related members
const char *getDefFile() { return defFile; } //void setDecFile(const char *f) { declFile=f; }
int getDefLine() { return defLine; } //void setDecLine(int l) { defLine=l; }
void setDecFile(const char *f) { declFile=f; }
void setDecLine(int l) { defLine=l; }
// convenience members // convenience members
bool isSignal() const { return mtype==Signal; } bool isSignal() const { return mtype==Signal; }
...@@ -219,8 +218,8 @@ class MemberDef : public Definition ...@@ -219,8 +218,8 @@ class MemberDef : public Definition
QCString declFile; // file where the declaration was found QCString declFile; // file where the declaration was found
int declLine; // line where the declaration was found int declLine; // line where the declaration was found
QCString def; // member definition in code (fully qualified name) QCString def; // member definition in code (fully qualified name)
QCString defFile; // file where the definition was found //QCString defFile; // file where the definition was found
int defLine; // line where the definition was found //int defLine; // line where the definition was found
QCString anc; // HTML anchor name QCString anc; // HTML anchor name
Specifier virt; // normal/virtual/pure virtual Specifier virt; // normal/virtual/pure virtual
Protection prot; // protection type [Public/Protected/Private] Protection prot; // protection type [Public/Protected/Private]
......
...@@ -75,7 +75,7 @@ void MemberGroup::setAnchors() ...@@ -75,7 +75,7 @@ void MemberGroup::setAnchors()
void MemberGroup::writeDeclarations(OutputList &ol, void MemberGroup::writeDeclarations(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd) ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd)
{ {
memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,doc,TRUE); memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,doc,TRUE,TRUE);
} }
void MemberGroup::writePlainDeclarations(OutputList &ol, void MemberGroup::writePlainDeclarations(OutputList &ol,
...@@ -101,8 +101,26 @@ int MemberGroup::countDecMembers() ...@@ -101,8 +101,26 @@ int MemberGroup::countDecMembers()
{ {
if (numDeclMembers==-1) /* number of member not cached */ if (numDeclMembers==-1) /* number of member not cached */
{ {
memberList->countDecMembers(TRUE); memberList->countDecMembers(TRUE,TRUE);
numDeclMembers = memberList->totalCount(); numDeclMembers = memberList->totalCount();
} }
return numDeclMembers; return numDeclMembers;
} }
void MemberGroup::distributeMemberGroupDocumentation()
{
MemberDef *md=memberList->first();
if (md && md->hasDocumentation())
{
MemberDef *omd=memberList->next();
while (omd)
{
if (!omd->hasDocumentation())
{
omd->setBriefDescription(md->briefDescription());
omd->setDocumentation(md->documentation());
}
omd=memberList->next();
}
}
}
...@@ -53,6 +53,7 @@ class MemberGroup /* : public Definition */ ...@@ -53,6 +53,7 @@ class MemberGroup /* : public Definition */
bool allMembersInSameSection() { return inSameSection; } bool allMembersInSameSection() { return inSameSection; }
void addToDeclarationSection(); void addToDeclarationSection();
int countDecMembers(); int countDecMembers();
void distributeMemberGroupDocumentation();
private: private:
MemberList *memberList; // list of all members in the group MemberList *memberList; // list of all members in the group
......
...@@ -44,13 +44,16 @@ int MemberList::compareItems(GCI item1, GCI item2) ...@@ -44,13 +44,16 @@ int MemberList::compareItems(GCI item1, GCI item2)
return strcmp(c1->name(),c2->name()); return strcmp(c1->name(),c2->name());
} }
void MemberList::countDecMembers(bool inGroup) void MemberList::countDecMembers(bool inGroup,bool countSubGroups)
{ {
//printf("----- countDecMembers ----\n");
varCnt=funcCnt=enumCnt=enumValCnt=typeCnt=protoCnt=defCnt=friendCnt=0; varCnt=funcCnt=enumCnt=enumValCnt=typeCnt=protoCnt=defCnt=friendCnt=0;
m_count=0; m_count=0;
MemberDef *md=first(); MemberDef *md=first();
while (md) while (md)
{ {
//printf("md=%p md->name()=`%s' inGroup=%d getMemberGroup()=%p\n",
// md,md->name().data(),inGroup,md->getMemberGroup());
if (!(md->memberClass()==0 && md->isStatic() && !Config::extractPrivateFlag) && if (!(md->memberClass()==0 && md->isStatic() && !Config::extractPrivateFlag) &&
(!Config::hideMemberFlag || md->hasDocumentation()) && (!Config::hideMemberFlag || md->hasDocumentation()) &&
( (
...@@ -60,7 +63,8 @@ void MemberList::countDecMembers(bool inGroup) ...@@ -60,7 +63,8 @@ void MemberList::countDecMembers(bool inGroup)
(md->isEnumerate() && (md->isEnumerate() &&
md->hasDocumentedEnumValues() md->hasDocumentedEnumValues()
) )
) && inGroup==(md->getMemberGroup()!=0) && ) &&
inGroup==(md->getMemberGroup()!=0) &&
!(inGroup && md->protection()==Private && !Config::extractPrivateFlag) !(inGroup && md->protection()==Private && !Config::extractPrivateFlag)
) )
{ {
...@@ -88,17 +92,18 @@ void MemberList::countDecMembers(bool inGroup) ...@@ -88,17 +92,18 @@ void MemberList::countDecMembers(bool inGroup)
} }
md=next(); md=next();
} }
if (memberGroupList && !inGroup) if (memberGroupList && countSubGroups)
{ {
MemberGroupListIterator mgli(*memberGroupList); MemberGroupListIterator mgli(*memberGroupList);
MemberGroup *mg; MemberGroup *mg;
for (;(mg=mgli.current());++mgli) for (;(mg=mgli.current());++mgli)
{ {
//printf("memberGroupList adding %d inGroup=%d\n", int mgCount = mg->countDecMembers();
// mg->countDecMembers(),m_count); //printf("memberGroupList adding %d inGroup=%d\n",mgCount,inGroup);
m_count+=mg->countDecMembers(); m_count+=mgCount;
} }
} }
//printf("----- end countDecMembers ----\n");
//printf("MemberList::countDecMembers(%d)=%d\n",inGroup,m_count); //printf("MemberList::countDecMembers(%d)=%d\n",inGroup,m_count);
} }
...@@ -147,12 +152,13 @@ MemberListIterator::MemberListIterator(const QList<MemberDef> &l) : ...@@ -147,12 +152,13 @@ MemberListIterator::MemberListIterator(const QList<MemberDef> &l) :
void MemberList::writePlainDeclarations(OutputList &ol, void MemberList::writePlainDeclarations(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd, ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
bool inGroup bool inGroup,bool countSubGroups
) )
{ {
countDecMembers(inGroup); //printf("----- writePlainDeclaration() ----\n");
//printf("writePlainDeclaration() totalCount()=%d defineCount()=%d\n",totalCount(),defineCount()); countDecMembers(inGroup,countSubGroups);
if (totalCount()==0) return; // no members in this list if (totalCount()==0) return; // no members in this list
//printf("----> writePlainDeclaration() inGroup=%d totalCount()=%d\n",inGroup,totalCount());
ol.pushGeneratorState(); ol.pushGeneratorState();
...@@ -163,6 +169,7 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -163,6 +169,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (defineCount()>0) if (defineCount()>0)
{ {
//printf("There are %d defines\n",defineCount());
if (sectionPerType) if (sectionPerType)
{ {
ol.startMemberHeader(); ol.startMemberHeader();
...@@ -191,6 +198,7 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -191,6 +198,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (protoCount()>0) if (protoCount()>0)
{ {
//printf("There are %d prototypes\n",protoCount());
if (sectionPerType) if (sectionPerType)
{ {
ol.startMemberHeader(); ol.startMemberHeader();
...@@ -214,6 +222,7 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -214,6 +222,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (typedefCount()>0) if (typedefCount()>0)
{ {
//printf("There are %d typedefs\n",typedefCount());
if (sectionPerType) if (sectionPerType)
{ {
ol.startMemberHeader(); ol.startMemberHeader();
...@@ -236,6 +245,7 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -236,6 +245,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
// write enums // write enums
if (enumCount()>0) if (enumCount()>0)
{ {
//printf("There are %d enums\n",enumCount());
if (sectionPerType) if (sectionPerType)
{ {
ol.startMemberHeader(); ol.startMemberHeader();
...@@ -357,6 +367,7 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -357,6 +367,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
{ {
ol.startMemberDescription(); ol.startMemberDescription();
parseDoc(ol, parseDoc(ol,
md->getDefFileName(),md->getDefLine(),
cd?cd->name().data():0,md->name().data(), cd?cd->name().data():0,md->name().data(),
md->briefDescription() md->briefDescription()
); );
...@@ -384,6 +395,7 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -384,6 +395,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
// write functions // write functions
if (funcCount()>0) if (funcCount()>0)
{ {
//printf("There are %d functions\n",funcCount());
if (sectionPerType) if (sectionPerType)
{ {
ol.startMemberHeader(); ol.startMemberHeader();
...@@ -408,6 +420,7 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -408,6 +420,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (friendCount()>0) if (friendCount()>0)
{ {
//printf("There are %d friends\n",friendCount());
MemberListIterator mli(*this); MemberListIterator mli(*this);
for ( ; (md=mli.current()) ; ++mli ) for ( ; (md=mli.current()) ; ++mli )
{ {
...@@ -455,6 +468,7 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -455,6 +468,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
// write variables // write variables
if (varCount()>0) if (varCount()>0)
{ {
//printf("There are %d variables\n",varCount());
if (sectionPerType) if (sectionPerType)
{ {
ol.startMemberHeader(); ol.startMemberHeader();
...@@ -483,6 +497,7 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -483,6 +497,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (md->fromAnnonymousScope() && !md->annonymousDeclShown() if (md->fromAnnonymousScope() && !md->annonymousDeclShown()
&& inGroup==(md->getMemberGroup()!=0)) && inGroup==(md->getMemberGroup()!=0))
{ {
//printf("annonymous compound members\n");
md->setFromAnnonymousScope(FALSE); md->setFromAnnonymousScope(FALSE);
md->writeDeclaration(ol,cd,nd,fd,gd,inGroup); md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
md->setFromAnnonymousScope(TRUE); md->setFromAnnonymousScope(TRUE);
...@@ -493,16 +508,28 @@ void MemberList::writePlainDeclarations(OutputList &ol, ...@@ -493,16 +508,28 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (!sectionPerType) { ol.endMemberList(); /*ol.writeChar('\n');*/ } if (!sectionPerType) { ol.endMemberList(); /*ol.writeChar('\n');*/ }
ol.popGeneratorState(); ol.popGeneratorState();
//printf("----- end writePlainDeclaration() ----\n");
} }
void MemberList::writeDeclarations(OutputList &ol, void MemberList::writeDeclarations(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd, ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
const char *title,const char *subtitle,bool inGroup) const char *title,const char *subtitle,
bool inGroup,bool countSubGroups)
{ {
//printf("MemberList::writeDeclaration(title=`%s',subtitle=`%s')\n", //printf("MemberList::writeDeclaration(title=`%s',subtitle=`%s')\n",title,subtitle);
// title,subtitle); //printf("----- writeDeclaration() ----\n");
countDecMembers(inGroup); countDecMembers(FALSE,countSubGroups); // count member not in group
if (totalCount()==0) return; int normalMembers = totalCount();
int ingroupMembers = 0;
//printf("Normal members %d\n",normalMembers);
if (inGroup)
{
countDecMembers(TRUE,countSubGroups); // count member inside group
ingroupMembers = totalCount();
}
int totalMembers = normalMembers + ingroupMembers;
//printf("Total members %d\n",totalMembers);
if (totalMembers==0) return;
if (title) if (title)
{ {
ol.startMemberHeader(); ol.startMemberHeader();
...@@ -514,13 +541,13 @@ void MemberList::writeDeclarations(OutputList &ol, ...@@ -514,13 +541,13 @@ void MemberList::writeDeclarations(OutputList &ol,
//printf("subtitle=`%s'\n",subtitle); //printf("subtitle=`%s'\n",subtitle);
ol.startMemberSubtitle(); ol.startMemberSubtitle();
if (inGroup) if (inGroup)
parseDoc(ol,0,0,subtitle); parseDoc(ol,"<generated>",1,0,0,subtitle);
else else
parseText(ol,subtitle); parseText(ol,subtitle);
ol.endMemberSubtitle(); ol.endMemberSubtitle();
} }
writePlainDeclarations(ol,cd,nd,fd,gd,inGroup); writePlainDeclarations(ol,cd,nd,fd,gd,inGroup,FALSE);
if (memberGroupList) if (memberGroupList)
{ {
...@@ -530,13 +557,17 @@ void MemberList::writeDeclarations(OutputList &ol, ...@@ -530,13 +557,17 @@ void MemberList::writeDeclarations(OutputList &ol,
while ((mg=mgli.current())) while ((mg=mgli.current()))
{ {
ol.startMemberGroupHeader(); ol.startMemberGroupHeader();
parseText(ol,mg->header()); if (mg->header()!="[NOHEADER]")
{
parseText(ol,mg->header());
}
ol.endMemberGroupHeader(); ol.endMemberGroupHeader();
if (!mg->documentation().isEmpty()) if (!mg->documentation().isEmpty())
{ {
//printf("Member group has docs!\n"); //printf("Member group has docs!\n");
ol.startMemberGroupDocs(); ol.startMemberGroupDocs();
parseDoc(ol,0,0,mg->documentation()); parseDoc(ol,"<generated>",1,
0,0,mg->documentation());
ol.endMemberGroupDocs(); ol.endMemberGroupDocs();
} }
ol.startMemberGroup(); ol.startMemberGroup();
...@@ -545,6 +576,7 @@ void MemberList::writeDeclarations(OutputList &ol, ...@@ -545,6 +576,7 @@ void MemberList::writeDeclarations(OutputList &ol,
ol.endMemberGroup(mgli.current()==0); ol.endMemberGroup(mgli.current()==0);
} }
} }
//printf("----- end writeDeclaration() ----\n");
} }
......
...@@ -41,7 +41,7 @@ class MemberList : public QList<MemberDef> ...@@ -41,7 +41,7 @@ class MemberList : public QList<MemberDef>
int protoCount() const { return protoCnt; } int protoCount() const { return protoCnt; }
int defineCount() const { return defCnt; } int defineCount() const { return defCnt; }
int friendCount() const { return friendCnt; } int friendCount() const { return friendCnt; }
void countDecMembers(bool inGroup); void countDecMembers(bool inGroup,bool countSubGroups);
void countDocMembers(); void countDocMembers();
int totalCount() const int totalCount() const
{ return //varCnt+funcCnt+enumCnt+enumValCnt+typeCnt+ { return //varCnt+funcCnt+enumCnt+enumValCnt+typeCnt+
...@@ -50,10 +50,11 @@ class MemberList : public QList<MemberDef> ...@@ -50,10 +50,11 @@ class MemberList : public QList<MemberDef>
} }
void writePlainDeclarations(OutputList &ol, void writePlainDeclarations(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd, ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
bool inGroup=FALSE); bool inGroup=FALSE,bool countSubGroups=TRUE);
void writeDeclarations(OutputList &ol, void writeDeclarations(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd, ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
const char *title,const char *subtitle,bool inGroup=FALSE); const char *title,const char *subtitle,
bool inGroup=FALSE,bool countSubGroups=TRUE);
void writeDocumentation(OutputList &ol,const char *scopeName void writeDocumentation(OutputList &ol,const char *scopeName
/*,MemberDef::MemberType m*/); /*,MemberDef::MemberType m*/);
void addMemberGroup(MemberGroup *mg); void addMemberGroup(MemberGroup *mg);
......
...@@ -18,6 +18,57 @@ ...@@ -18,6 +18,57 @@
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include "config.h" #include "config.h"
#include <qregexp.h>
static QCString outputFormat;
static int warnFormatOrder; // 1 = $file,$line,$text
// 2 = $text,$line,$file
// 3 = $line,$text,$file
// 4 = $file,$text,$line
// 5 = $text,$file,$line
// 6 = $line,$file,$text
void initWarningFormat()
{
int filePos = Config::warnFormat.find("$file");
int linePos = Config::warnFormat.find("$line");
int textPos = Config::warnFormat.find("$text");
// sort items on position (there are 6 cases)
warnFormatOrder = 1;
if (filePos>linePos && filePos>textPos)
{
if (linePos>textPos) // $text,$line,$file
{
warnFormatOrder = 2;
}
else // $line,$text,$file
{
warnFormatOrder = 3;
}
}
else if (filePos<linePos && filePos<textPos)
{
if (linePos>textPos) // $file,$text,$line
{
warnFormatOrder = 4;
}
}
else if (filePos<linePos && filePos>textPos) // $text,$file,$line
{
warnFormatOrder = 5;
}
else // $line,$file,$text
{
warnFormatOrder = 6;
}
outputFormat = Config::warnFormat.
replace(QRegExp("\\$file"),"%s").
replace(QRegExp("\\$text"),"%s").
replace(QRegExp("\\$line"),"%d")+
'\n';
}
void msg(const char *fmt, ...) void msg(const char *fmt, ...)
{ {
...@@ -30,7 +81,31 @@ void msg(const char *fmt, ...) ...@@ -30,7 +81,31 @@ void msg(const char *fmt, ...)
} }
} }
void warn(const char *fmt, ...) void warn(const char *file,int line,const char *fmt, ...)
{
if (Config::warningFlag)
{
if (file==0) file="<unknwon>";
char text[4096];
va_list args;
va_start(args, fmt);
vsprintf(text, fmt, args);
va_end(args);
switch(warnFormatOrder)
{
case 1: fprintf(stderr,outputFormat,file,line,text); break;
case 2: fprintf(stderr,outputFormat,text,line,file); break;
case 3: fprintf(stderr,outputFormat,line,text,file); break;
case 4: fprintf(stderr,outputFormat,file,text,line); break;
case 5: fprintf(stderr,outputFormat,text,file,line); break;
case 6: fprintf(stderr,outputFormat,line,file,text); break;
default:
printf("Error: warning format has not been initialized!\n");
}
}
}
void warn_cont(const char *fmt, ...)
{ {
if (Config::warningFlag) if (Config::warningFlag)
{ {
...@@ -41,6 +116,30 @@ void warn(const char *fmt, ...) ...@@ -41,6 +116,30 @@ void warn(const char *fmt, ...)
} }
} }
void warn_undoc(const char *file,int line,const char *fmt, ...)
{
if (Config::warningUndocFlag)
{
if (file==0) file="<unknwon>";
char text[4096];
va_list args;
va_start(args, fmt);
vsprintf(text, fmt, args);
va_end(args);
switch(warnFormatOrder)
{
case 1: fprintf(stderr,outputFormat,file,line,text); break;
case 2: fprintf(stderr,outputFormat,text,line,file); break;
case 3: fprintf(stderr,outputFormat,line,text,file); break;
case 4: fprintf(stderr,outputFormat,file,text,line); break;
case 5: fprintf(stderr,outputFormat,text,file,line); break;
case 6: fprintf(stderr,outputFormat,line,file,text); break;
default:
printf("Error: warning format has not been initialized!\n");
}
}
}
void err(const char *fmt, ...) void err(const char *fmt, ...)
{ {
va_list args; va_list args;
......
...@@ -19,7 +19,10 @@ ...@@ -19,7 +19,10 @@
#define MESSAGE_H #define MESSAGE_H
extern void msg(const char *fmt, ...); extern void msg(const char *fmt, ...);
extern void warn(const char *fmt, ...); extern void warn(const char *file,int line,const char *fmt, ...);
extern void warn_cont(const char *fmt, ...);
extern void warn_undoc(const char *file,int line,const char *fmt, ...);
extern void err(const char *fmt, ...); extern void err(const char *fmt, ...);
void initWarningFormat();
#endif #endif
...@@ -27,7 +27,9 @@ ...@@ -27,7 +27,9 @@
#include "doxygen.h" #include "doxygen.h"
#include "message.h" #include "message.h"
NamespaceDef::NamespaceDef(const char *name,const char *ref) : Definition(name) NamespaceDef::NamespaceDef(const char *df,int dl,
const char *name,const char *ref) :
Definition(df,dl,name)
{ {
fileName="namespace_"+nameToFile(name); fileName="namespace_"+nameToFile(name);
classList = new ClassList; classList = new ClassList;
...@@ -38,6 +40,8 @@ NamespaceDef::NamespaceDef(const char *name,const char *ref) : Definition(name) ...@@ -38,6 +40,8 @@ NamespaceDef::NamespaceDef(const char *name,const char *ref) : Definition(name)
memberGroupList = new MemberGroupList; memberGroupList = new MemberGroupList;
memberGroupList->setAutoDelete(TRUE); memberGroupList->setAutoDelete(TRUE);
memberGroupDict = new MemberGroupDict(1009); memberGroupDict = new MemberGroupDict(1009);
defFileName = df;
defLine = dl;
} }
NamespaceDef::~NamespaceDef() NamespaceDef::~NamespaceDef()
...@@ -49,6 +53,15 @@ NamespaceDef::~NamespaceDef() ...@@ -49,6 +53,15 @@ NamespaceDef::~NamespaceDef()
delete memberGroupDict; delete memberGroupDict;
} }
void NamespaceDef::distributeMemberGroupDocumentation()
{
MemberGroupListIterator mgli(*memberGroupList);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->distributeMemberGroupDocumentation();
}
}
void NamespaceDef::insertUsedFile(const char *f) void NamespaceDef::insertUsedFile(const char *f)
{ {
if (files.find(f)==-1) files.append(f); if (files.find(f)==-1) files.append(f);
...@@ -130,7 +143,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol) ...@@ -130,7 +143,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
OutputList briefOutput(&ol); OutputList briefOutput(&ol);
if (!briefDescription().isEmpty()) if (!briefDescription().isEmpty())
{ {
parseDoc(briefOutput,name(),0,briefDescription()); parseDoc(briefOutput,defFileName,defLine,name(),0,briefDescription());
ol+=briefOutput; ol+=briefOutput;
ol.writeString(" \n"); ol.writeString(" \n");
ol.pushGeneratorState(); ol.pushGeneratorState();
...@@ -183,7 +196,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol) ...@@ -183,7 +196,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
} }
if (!documentation().isEmpty()) if (!documentation().isEmpty())
{ {
parseDoc(ol,name(),0,documentation()+"\n"); parseDoc(ol,defFileName,defLine,name(),0,documentation()+"\n");
ol.newParagraph(); ol.newParagraph();
} }
ol.endTextBlock(); ol.endTextBlock();
......
...@@ -36,7 +36,8 @@ class MemberGroupList; ...@@ -36,7 +36,8 @@ class MemberGroupList;
class NamespaceDef : public Definition class NamespaceDef : public Definition
{ {
public: public:
NamespaceDef(const char *name,const char *ref=0); NamespaceDef(const char *defFileName,int defLine,
const char *name,const char *ref=0);
~NamespaceDef(); ~NamespaceDef();
//QCString namespaceFile() const { return fileName; } //QCString namespaceFile() const { return fileName; }
QCString getOutputFileBase() const { return fileName; } QCString getOutputFileBase() const { return fileName; }
...@@ -72,6 +73,7 @@ class NamespaceDef : public Definition ...@@ -72,6 +73,7 @@ class NamespaceDef : public Definition
{ {
return isLinkableInProject() || isReference(); return isLinkableInProject() || isReference();
} }
void distributeMemberGroupDocumentation();
private: private:
//QCString reference; //QCString reference;
......
...@@ -171,12 +171,12 @@ static FILE *findFile(const char *fileName) ...@@ -171,12 +171,12 @@ static FILE *findFile(const char *fileName)
{ {
QCString cmd = Config::inputFilter+" "+absName; QCString cmd = Config::inputFilter+" "+absName;
f=popen(cmd,"r"); f=popen(cmd,"r");
if (!f) warn("Warning: could not execute filter %s\n",cmd.data()); if (!f) err("Error: could not execute filter %s\n",cmd.data());
} }
else else
{ {
f=fopen(absName,"r"); f=fopen(absName,"r");
if (!f) warn("Warning: could not open file %s for reading\n",absName.data()); if (!f) err("Error: could not open file %s for reading\n",absName.data());
} }
if (f) if (f)
{ {
...@@ -761,7 +761,9 @@ void addDefine() ...@@ -761,7 +761,9 @@ void addDefine()
{ {
//bool ambig; //bool ambig;
//FileDef *fd=findFileDef(&inputNameDict,g_yyFileName,ambig); //FileDef *fd=findFileDef(&inputNameDict,g_yyFileName,ambig);
MemberDef *md=new MemberDef("#define",g_defName,g_defArgsStr,0, MemberDef *md=new MemberDef(
g_yyFileName,g_yyLineNr,
"#define",g_defName,g_defArgsStr,0,
Public,Normal,FALSE,FALSE,MemberDef::Define,0,0); Public,Normal,FALSE,FALSE,MemberDef::Define,0,0);
if (!g_defArgsStr.isEmpty()) if (!g_defArgsStr.isEmpty())
{ {
...@@ -773,8 +775,8 @@ void addDefine() ...@@ -773,8 +775,8 @@ void addDefine()
//printf("Setting initializer for `%s' to `%s'\n",g_defName.data(),g_defText.data()); //printf("Setting initializer for `%s' to `%s'\n",g_defName.data(),g_defText.data());
md->setInitializer(g_defLitText); md->setInitializer(g_defLitText);
md->setDefFile(g_yyFileName); //md->setDefFile(g_yyFileName);
md->setDefLine(g_yyLineNr); //md->setDefLine(g_yyLineNr);
md->setFileDef(g_yyFileDef); md->setFileDef(g_yyFileDef);
md->setDefinition("#define "+g_defName); md->setDefinition("#define "+g_defName);
......
...@@ -1665,7 +1665,7 @@ void RTFGenerator::incrementIndentLevel() ...@@ -1665,7 +1665,7 @@ void RTFGenerator::incrementIndentLevel()
m_listLevel++; m_listLevel++;
if (m_listLevel>indentLevels-1) if (m_listLevel>indentLevels-1)
{ {
warn("Warning: Maximum indent level (%d) exceeded while generating RTF output!\n",indentLevels); warn_cont("Warning: Maximum indent level (%d) exceeded while generating RTF output!\n",indentLevels);
m_listLevel=indentLevels-1; m_listLevel=indentLevels-1;
} }
} }
...@@ -1675,7 +1675,7 @@ void RTFGenerator::decrementIndentLevel() ...@@ -1675,7 +1675,7 @@ void RTFGenerator::decrementIndentLevel()
m_listLevel--; m_listLevel--;
if (m_listLevel<0) if (m_listLevel<0)
{ {
warn("Warning: Negative indent level while generating RTF output!\n"); warn_cont("Warning: Negative indent level while generating RTF output!\n");
m_listLevel=0; m_listLevel=0;
} }
} }
......
...@@ -29,8 +29,10 @@ ...@@ -29,8 +29,10 @@
class OutputList; class OutputList;
extern void parseMain(Entry *); extern void parseMain(Entry *);
extern void parseDoc(OutputList &ol,const char *clName, const char *memName, extern void parseDoc(OutputList &ol,
const QCString &docString); const char *fileName,int startLine,
const char *clName, const char *memName,
const QCString &docString);
extern void parseExample(OutputList &ol,const QCString &docString, extern void parseExample(OutputList &ol,const QCString &docString,
const char *fileName); const char *fileName);
extern void parseText(OutputList &ol,const QCString &txtString); extern void parseText(OutputList &ol,const QCString &txtString);
......
...@@ -56,7 +56,6 @@ ...@@ -56,7 +56,6 @@
static bool insideArgumentList; static bool insideArgumentList;
static QCString className; static QCString className;
static QCString memberName; static QCString memberName;
static QCString refName;
static OutputList * outDoc; static OutputList * outDoc;
static QCString code; static QCString code;
static QCString linkRef; static QCString linkRef;
...@@ -98,9 +97,9 @@ static Entry* global_root = 0 ; ...@@ -98,9 +97,9 @@ static Entry* global_root = 0 ;
static Entry* current = 0 ; static Entry* current = 0 ;
static Entry* previous = 0 ; static Entry* previous = 0 ;
static Entry* tempEntry = 0 ; static Entry* tempEntry = 0 ;
static int yyLineNr = 0 ; static int yyLineNr = 1 ;
static int anonCount = 0 ; static int anonCount = 0 ;
static char yyFileName[2048] ; static char yyFileName[4096] ;
static int lastMemberGroupLine; static int lastMemberGroupLine;
static bool sig; static bool sig;
static bool slot; static bool slot;
...@@ -179,7 +178,6 @@ static void initParser() ...@@ -179,7 +178,6 @@ static void initParser()
insideArgumentList=FALSE; insideArgumentList=FALSE;
className.resize(0); className.resize(0);
memberName.resize(0); memberName.resize(0);
refName="<unknown>";
code.resize(0); code.resize(0);
linkRef.resize(0); linkRef.resize(0);
linkText.resize(0); linkText.resize(0);
...@@ -415,15 +413,18 @@ static void includeFile(OutputList &ol,const char *fileName,bool quiet) ...@@ -415,15 +413,18 @@ static void includeFile(OutputList &ol,const char *fileName,bool quiet)
} }
else if (ambig) else if (ambig)
{ {
warn("Include file name %s is ambigious.\n",fileName); QCString text;
warn("Possible candidates:\n"); text.sprintf("Include file name %s is ambigious.\n",fileName);
//includeFileList.writeMatches(fileName); text+="Possible candidates:\n";
showFileDefMatches(&exampleNameDict,fileName); text+=showFileDefMatches(&exampleNameDict,fileName);
warn(yyFileName,yyLineNr,text);
} }
else else
{ {
warn("Warning: example file %s is not found. ",fileName); warn(yyFileName,yyLineNr,
warn("Check your EXAMPLE_PATH\n"); "Warning: example file %s is not found. "
"Check your EXAMPLE_PATH",fileName
);
} }
} }
...@@ -440,14 +441,17 @@ static void verbIncludeFile(OutputList &ol,const char *name) ...@@ -440,14 +441,17 @@ static void verbIncludeFile(OutputList &ol,const char *name)
} }
else if (ambig) else if (ambig)
{ {
warn("Include file name %s is ambigious.\n",name); QCString text;
warn("Possible candidates:\n"); text.sprintf("Include file name %s is ambigious.\n",name);
showFileDefMatches(&exampleNameDict,name); text+=("Possible candidates:\n");
text+=showFileDefMatches(&exampleNameDict,name);
warn(yyFileName,yyLineNr,text);
} }
else else
{ {
warn("Warning: example file %s is not found. ",name); warn(yyFileName,yyLineNr,
warn("Check your EXAMPLE_PATH\n"); "Warning: example file %s is not found. "
"Check your EXAMPLE_PATH",name);
} }
} }
...@@ -619,7 +623,8 @@ static void addListItemMarker(const char *marker) ...@@ -619,7 +623,8 @@ static void addListItemMarker(const char *marker)
if (listIndentStack.isEmpty()) if (listIndentStack.isEmpty())
{ {
insideItemList=FALSE; insideItemList=FALSE;
warn("Warning: list item with invalid indent found!\n"); warn(yyFileName,yyLineNr,
"Warning: list item with invalid indent found!");
} }
else else
{ {
...@@ -690,7 +695,8 @@ static void addSection() ...@@ -690,7 +695,8 @@ static void addSection()
} }
else else
{ {
warn("Warning: Duplicate label %s found!\n",sectionLabel.data()); warn(yyFileName,yyLineNr,
"Warning: Duplicate label %s found!",sectionLabel.data());
} }
} }
...@@ -731,7 +737,7 @@ static void checkDocs() ...@@ -731,7 +737,7 @@ static void checkDocs()
) )
{ {
warn("Warning: Found lonely '<' symbol at the start of the documentation " warn("Warning: Found lonely '<' symbol at the start of the documentation "
"at line %d of %s\n",yyLineNr,yyFileName); "at line %d of %s",yyLineNr,yyFileName);
} }
} }
...@@ -810,28 +816,33 @@ static QCString findAndCopyImage(const char *fileName,ImageTypes type) ...@@ -810,28 +816,33 @@ static QCString findAndCopyImage(const char *fileName,ImageTypes type)
} }
else else
{ {
warn("Warning: could not write output image %s\n",outputFile.data()); warn(yyFileName,yyLineNr,
"Warning: could not write output image %s",outputFile.data());
} }
} }
else else
{ {
warn("Warning: could not open image %s\n",fileName); warn(yyFileName,yyLineNr,
"Warning: could not open image %s",fileName);
} }
} }
else if (ambig) else if (ambig)
{ {
warn("Warning: image file name %s is ambigious.\n",fileName); QCString text;
warn("Possible candidates:\n"); text.sprintf("Warning: image file name %s is ambigious.\n",fileName);
//includeFileList.writeMatches(fileName); text+="Possible candidates:\n";
showFileDefMatches(&imageNameDict,fileName); text+=showFileDefMatches(&imageNameDict,fileName);
warn(yyFileName,yyLineNr,text);
} }
else else
{ {
result=fileName; result=fileName;
if (result.left(5)!="http:") if (result.left(5)!="http:")
{ {
warn("Warning: image file %s is not found in IMAGE_PATH: " warn(yyFileName,yyLineNr,
"assuming external image.\n",fileName); "Warning: image file %s is not found in IMAGE_PATH: "
"assuming external image.",fileName
);
} }
} }
return result; return result;
...@@ -930,7 +941,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -930,7 +941,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
%x DefineArg %x DefineArg
%x DefineEnd %x DefineEnd
%x Include %x Include
%x ClassName %x CompoundName
%x ClassVar %x ClassVar
%x ClassTemplSpec %x ClassTemplSpec
%x Bases %x Bases
...@@ -1084,7 +1095,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -1084,7 +1095,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<*>\x06[^\x06]*\x06 { // new file <*>\x06[^\x06]*\x06 { // new file
if (memberGroupId!=NOGROUP) if (memberGroupId!=NOGROUP)
{ {
warn("Warning: Missing //@} in file %s\n",yyFileName); warn(yyFileName,yyLineNr,"Warning: Missing //@}");
memberGroupId=NOGROUP; memberGroupId=NOGROUP;
} }
yyLineNr= 0 ; // there is always an extra newline at the start of the file yyLineNr= 0 ; // there is always an extra newline at the start of the file
...@@ -1246,8 +1257,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -1246,8 +1257,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
BEGIN( DocScan ); BEGIN( DocScan );
} }
*/ */
<DocScan>{CMD}"endlink"/[^a-z_A-Z0-9] { warn("Warning: \\endlink without \\link " <DocScan>{CMD}"endlink"/[^a-z_A-Z0-9] { warn(yyFileName,yyLineNr,
"in documentation of %s\n", refName.data()); "Warning: \\endlink without \\link "
"in documentation."
);
} }
<DocScan>{CMD}"addindex"/{BN} { <DocScan>{CMD}"addindex"/{BN} {
BEGIN(DocIndexWord); BEGIN(DocIndexWord);
...@@ -1620,8 +1633,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -1620,8 +1633,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<DocScan>{CMD}"endif"/[^a-z_A-Z0-9] { <DocScan>{CMD}"endif"/[^a-z_A-Z0-9] {
if (--depthIf<0) if (--depthIf<0)
{ {
warn("Warning: documentation block contains \\endif without " warn(yyFileName,yyLineNr,
"matching \\if found in documentation of %s!",refName.data()); "Warning: documentation block contains \\endif without "
"matching \\if found in documentation."
);
} }
else else
{ {
...@@ -1657,8 +1672,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -1657,8 +1672,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
} }
else if (!generateLink(*outDoc,className,yytext,TRUE,0)) else if (!generateLink(*outDoc,className,yytext,TRUE,0))
{ {
warn("Warning: reference to unknown section %s!\n",yytext); warn(yyFileName,yyLineNr,"Warning: reference to unknown section %s!",yytext);
outDoc->writeBoldString(" unknown reference!"); outDoc->writeBoldString(" unknown reference! ");
} }
BEGIN(DocScan); BEGIN(DocScan);
} }
...@@ -1687,8 +1702,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -1687,8 +1702,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
} }
else if (!generateLink(*outDoc,className,sectionRef,TRUE,text)) else if (!generateLink(*outDoc,className,sectionRef,TRUE,text))
{ {
warn("Warning: reference to unknown section %s!\n",sectionRef.data()); warn(yyFileName,yyLineNr,"Warning: reference to unknown section %s!",sectionRef.data());
outDoc->writeBoldString("unknown reference!"); outDoc->writeBoldString(" unknown reference! ");
} }
BEGIN(DocScan); BEGIN(DocScan);
} }
...@@ -1705,8 +1720,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -1705,8 +1720,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
} }
else else
{ {
warn("Warning: reference to unknown section %s!\n",sectionRef.data()); warn(yyFileName,yyLineNr,"Warning: reference to unknown section %s!",sectionRef.data());
outDoc->writeBoldString("unknown reference!"); outDoc->writeBoldString(" unknown reference! ");
} }
BEGIN(DocScan); BEGIN(DocScan);
} }
...@@ -1767,10 +1782,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -1767,10 +1782,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
BEGIN(DocScan); BEGIN(DocScan);
} }
<DocImage>[a-z_A-Z0-9\.\-]+ { <DocImage>[a-z_A-Z0-9\.\-]+ {
warn("Warning: %s is an unsupported output format for \\image\n",yytext); warn(yyFileName,yyLineNr,"Warning: %s is an unsupported output format for \\image",yytext);
} }
<DocImage,DocHtmlImageName,DocLatexImageName>\n { <DocImage,DocHtmlImageName,DocLatexImageName>\n {
warn("Warning: invalid \\image command found!\n"); warn(yyFileName,yyLineNr,"Warning: invalid \\image command found!");
outDoc->enableAll(); outDoc->enableAll();
BEGIN(DocScan); BEGIN(DocScan);
} }
...@@ -1780,8 +1795,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -1780,8 +1795,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
BEGIN( DocCodeBlock ); BEGIN( DocCodeBlock );
} }
<DocScan>{CMD}"endcode"/[^a-z_A-Z0-9] { <DocScan>{CMD}"endcode"/[^a-z_A-Z0-9] {
warn("Warning: \\endcode without <PRE> or \\code " warn(yyFileName,yyLineNr,"Warning: \\endcode without <PRE> or \\code "
"in the documentation of %s\n",refName.data()); "in the documentation.");
} }
<DocScan>{SCOPEMASK}"("[a-z_A-Z0-9,:\<\> \t\*\&]+")" { <DocScan>{SCOPEMASK}"("[a-z_A-Z0-9,:\<\> \t\*\&]+")" {
generateRef(*outDoc,className,yytext,inSeeBlock); generateRef(*outDoc,className,yytext,inSeeBlock);
...@@ -1891,13 +1906,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -1891,13 +1906,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<DocScan>"</"{STRONG}{ATTR}">" { outDoc->endBold(); } <DocScan>"</"{STRONG}{ATTR}">" { outDoc->endBold(); }
<DocScan>"<"{CENTER}{ATTR}">" { outDoc->startCenter(); } <DocScan>"<"{CENTER}{ATTR}">" { outDoc->startCenter(); }
<DocScan>"</"{CENTER}{ATTR}">" { outDoc->endCenter(); } <DocScan>"</"{CENTER}{ATTR}">" { outDoc->endCenter(); }
<DocScan>"<"{TABLE}{ATTR}">" { <DocScan>"<"{TABLE}{ATTR}">" { startTable(); }
startTable(); <DocScan>"</"{TABLE}{ATTR}">" { endTable(); }
/*outDoc->startTable();*/ }
<DocScan>"</"{TABLE}{ATTR}">" {
endTable();
/*outDoc->endTable();*/
}
<DocScan>"<"{INPUT}{ATTR}">" <DocScan>"<"{INPUT}{ATTR}">"
<DocScan>"<"{SMALL}{ATTR}">" { outDoc->startSmall(); } <DocScan>"<"{SMALL}{ATTR}">" { outDoc->startSmall(); }
<DocScan>"</"{SMALL}{ATTR}">" { outDoc->endSmall(); } <DocScan>"</"{SMALL}{ATTR}">" { outDoc->endSmall(); }
...@@ -1928,8 +1938,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -1928,8 +1938,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
BEGIN( DocCodeBlock ); BEGIN( DocCodeBlock );
} }
<DocScan>"</"{PRE}{ATTR}">" { <DocScan>"</"{PRE}{ATTR}">" {
warn("Warning: </PRE> without <PRE> or \\code" warn(yyFileName,yyLineNr,
"in the documentation of %s\n",refName.data()); "Warning: </PRE> without <PRE> or \\code"
"in the documentation."
);
} }
<DocScan>"<"{SUB}{ATTR}">" { outDoc->startSubscript(); } <DocScan>"<"{SUB}{ATTR}">" { outDoc->startSubscript(); }
<DocScan>"</"{SUB}{ATTR}">" { outDoc->endSubscript(); } <DocScan>"</"{SUB}{ATTR}">" { outDoc->endSubscript(); }
...@@ -1945,7 +1957,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -1945,7 +1957,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<DocScan>"</"{OL}{ATTR}">" { <DocScan>"</"{OL}{ATTR}">" {
if (currentListIndentLevel<=0) if (currentListIndentLevel<=0)
{ {
warn("Warning: more </ol> tags than <ol> tags in the documentation of %s\n",yyFileName); warn(yyFileName,yyLineNr,
"Warning: more </ol> tags than <ol> tags in the documentation."
);
} }
else else
{ {
...@@ -1959,7 +1973,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -1959,7 +1973,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<DocScan>"</"{UL}{ATTR}">" { <DocScan>"</"{UL}{ATTR}">" {
if (currentListIndentLevel<=0) if (currentListIndentLevel<=0)
{ {
warn("Warning: more </ul> tags than <ul> tags in the documentation of %s\n",yyFileName); warn(yyFileName,yyLineNr,
"Warning: more </ul> tags than <ul> tags in the documentation."
);
} }
else else
{ {
...@@ -1980,7 +1996,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -1980,7 +1996,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<DocScan>"</"{DL}{ATTR}">" { <DocScan>"</"{DL}{ATTR}">" {
if (currentListIndentLevel<=0) if (currentListIndentLevel<=0)
{ {
warn("Warning: more </dl> tags than <dl> tags in the documentation of %s\n",yyFileName); warn(yyFileName,yyLineNr,
"Warning: more </dl> tags than <dl> tags in the documentation."
);
} }
else else
{ {
...@@ -2278,7 +2296,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -2278,7 +2296,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr; current->startLine = yyLineNr;
current->bodyLine = yyLineNr; current->bodyLine = yyLineNr;
lineCount(); lineCount();
BEGIN( ClassName ); BEGIN( CompoundName );
} }
<FindMembers>{B}*"module"{BN}+ { <FindMembers>{B}*"module"{BN}+ {
isTypedef=FALSE; isTypedef=FALSE;
...@@ -2288,7 +2306,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -2288,7 +2306,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr; current->startLine = yyLineNr;
current->bodyLine = yyLineNr; current->bodyLine = yyLineNr;
lineCount(); lineCount();
BEGIN( ClassName ); BEGIN( CompoundName );
} }
<FindMembers>{B}*"interface"{BN}+ { // M$/Corba IDL interface <FindMembers>{B}*"interface"{BN}+ { // M$/Corba IDL interface
isTypedef=FALSE; isTypedef=FALSE;
...@@ -2299,7 +2317,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -2299,7 +2317,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr; current->startLine = yyLineNr;
current->bodyLine = yyLineNr; current->bodyLine = yyLineNr;
lineCount(); lineCount();
BEGIN( ClassName ); BEGIN( CompoundName );
} }
<FindMembers>{B}*"exception"{BN}+ { // Corba IDL exception <FindMembers>{B}*"exception"{BN}+ { // Corba IDL exception
isTypedef=FALSE; isTypedef=FALSE;
...@@ -2310,7 +2328,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -2310,7 +2328,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr; current->startLine = yyLineNr;
current->bodyLine = yyLineNr; current->bodyLine = yyLineNr;
lineCount(); lineCount();
BEGIN( ClassName ); BEGIN( CompoundName );
} }
<FindMembers>{B}*(("typedef"{BN}+)?)"class"{BN}+ { <FindMembers>{B}*(("typedef"{BN}+)?)"class"{BN}+ {
isTypedef=((QCString)yytext).find("typedef")!=-1; isTypedef=((QCString)yytext).find("typedef")!=-1;
...@@ -2321,7 +2339,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -2321,7 +2339,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr; current->startLine = yyLineNr;
current->bodyLine = yyLineNr; current->bodyLine = yyLineNr;
lineCount() ; lineCount() ;
BEGIN( ClassName ) ; BEGIN( CompoundName ) ;
} }
<FindMembers>{B}*(("typedef"{BN}+)?)"struct"{BN}+ { <FindMembers>{B}*(("typedef"{BN}+)?)"struct"{BN}+ {
isTypedef=((QCString)yytext).find("typedef")!=-1; isTypedef=((QCString)yytext).find("typedef")!=-1;
...@@ -2332,7 +2350,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -2332,7 +2350,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr; current->startLine = yyLineNr;
current->bodyLine = yyLineNr; current->bodyLine = yyLineNr;
lineCount() ; lineCount() ;
BEGIN( ClassName ) ; BEGIN( CompoundName ) ;
} }
<FindMembers>{B}*(("typedef"{BN}+)?)"union"{BN}+ { <FindMembers>{B}*(("typedef"{BN}+)?)"union"{BN}+ {
isTypedef=((QCString)yytext).find("typedef")!=-1; isTypedef=((QCString)yytext).find("typedef")!=-1;
...@@ -2343,7 +2361,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -2343,7 +2361,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr; current->startLine = yyLineNr;
current->bodyLine = yyLineNr; current->bodyLine = yyLineNr;
lineCount() ; lineCount() ;
BEGIN( ClassName ) ; BEGIN( CompoundName ) ;
} }
<FindMembers>{B}*(("typedef"{BN}+)?)"enum"{BN}+ { <FindMembers>{B}*(("typedef"{BN}+)?)"enum"{BN}+ {
isTypedef=((QCString)yytext).find("typedef")!=-1; isTypedef=((QCString)yytext).find("typedef")!=-1;
...@@ -2354,7 +2372,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -2354,7 +2372,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr; current->startLine = yyLineNr;
current->bodyLine = yyLineNr; current->bodyLine = yyLineNr;
lineCount() ; lineCount() ;
BEGIN( ClassName ) ; BEGIN( CompoundName ) ;
} }
<Operator>"("{BN}*")"{BN}*/"(" { <Operator>"("{BN}*")"{BN}*/"(" {
lineCount(); lineCount();
...@@ -2689,15 +2707,17 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -2689,15 +2707,17 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<FindMembers>"//@{"|"/*@{*/" { <FindMembers>"//@{"|"/*@{*/" {
if (memberGroupId!=NOGROUP) if (memberGroupId!=NOGROUP)
{ {
warn("Warning: ignoring nested member group " warn(yyFileName,yyLineNr,"Warning: ignoring nested member group. "
"at line %d of %s. Previous command was found at line %d\n", "Previous command was found at line %d.",lastMemberGroupLine);
yyLineNr,yyFileName,lastMemberGroupLine);
} }
else if (memberGroupHeader.isEmpty()) else if (memberGroupHeader.isEmpty())
{ {
warn("Warning: member group has empty header " //warn("Warning: member group does not have a header "
"at line %d of %s.\n",yyLineNr,yyFileName); // "at line %d of %s.\n",yyLineNr,yyFileName);
memberGroupHeader="[No header specified!]"; memberGroupHeader="[NOHEADER]";
memberGroupId = newMemberGroupId();
current->mGrpId = memberGroupId;
lastMemberGroupLine = yyLineNr;
} }
else else
{ {
...@@ -2709,8 +2729,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -2709,8 +2729,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<FindMembers>"//@}"|"/*@}*/" { <FindMembers>"//@}"|"/*@}*/" {
if (memberGroupId==NOGROUP) if (memberGroupId==NOGROUP)
{ {
warn("Warning: end of member group without matching begin " warn(yyFileName,yyLineNr,
"at line %d of %s.\n",yyLineNr,yyFileName); "Warning: end of member group without matching begin.");
} }
else else
{ {
...@@ -3708,7 +3728,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -3708,7 +3728,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<SkipString>. { <SkipString>. {
//addToBodyCond(yytext); //addToBodyCond(yytext);
} }
<Bases,ClassName>";" { <Bases,CompoundName>";" {
current->section = Entry::EMPTY_SEC ; current->section = Entry::EMPTY_SEC ;
current->type.resize(0) ; current->type.resize(0) ;
current->name.resize(0) ; current->name.resize(0) ;
...@@ -3716,7 +3736,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -3716,7 +3736,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->argList->clear(); current->argList->clear();
BEGIN( FindMembers ) ; BEGIN( FindMembers ) ;
} }
<ClassName>{SCOPENAME}{BN}*/"<" { <CompoundName>{SCOPENAME}{BN}*/"<" {
sharpCount = 0; sharpCount = 0;
current->name = yytext ; current->name = yytext ;
lineCount(); lineCount();
...@@ -3739,7 +3759,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -3739,7 +3759,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<ClassTemplSpec>. { <ClassTemplSpec>. {
current->name += yytext; current->name += yytext;
} }
<ClassName>{SCOPENAME} { <CompoundName>{SCOPENAME} {
current->name = yytext ; current->name = yytext ;
lineCount(); lineCount();
BEGIN( ClassVar ); BEGIN( ClassVar );
...@@ -3790,7 +3810,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -3790,7 +3810,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
} }
BEGIN( FindMembers ); BEGIN( FindMembers );
} }
<ClassName,ClassVar>{B}*"{"{B}* { current->fileName = yyFileName ; <CompoundName,ClassVar>{B}*"{"{B}* { current->fileName = yyFileName ;
current->startLine = yyLineNr ; current->startLine = yyLineNr ;
current->name = removeRedundantWhiteSpace(current->name); current->name = removeRedundantWhiteSpace(current->name);
if (current->name.isEmpty() && !isTypedef) // anonymous compound if (current->name.isEmpty() && !isTypedef) // anonymous compound
...@@ -4014,7 +4034,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -4014,7 +4034,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
BEGIN( tmpDocType ); BEGIN( tmpDocType );
} }
<JavaDoc>"<"{TABLE}{ATTR}">" { <JavaDoc>"<"{TABLE}{ATTR}">" {
current->doc+=yytext; //current->doc+=yytext;
int i; int i;
for (i=yyleng-1;i>=0;i--) for (i=yyleng-1;i>=0;i--)
{ {
...@@ -4131,6 +4151,15 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -4131,6 +4151,15 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr; current->startLine = yyLineNr;
BEGIN( ExampleDocArg1 ); BEGIN( ExampleDocArg1 );
} }
<LineDoc>{CMD}"name"[^\n]*\n {
memberGroupHeader=&yytext[5];
memberGroupHeader=memberGroupHeader.stripWhiteSpace();
current->section = Entry::MEMBERGRP_SEC;
current->fileName = yyFileName;
current->startLine = yyLineNr;
yyLineNr++;
BEGIN( lastDocContext );
}
<Doc,JavaDoc>{CMD}"name"{B}+ { <Doc,JavaDoc>{CMD}"name"{B}+ {
//printf("--> mgroup found!\n"); //printf("--> mgroup found!\n");
current->section = Entry::MEMBERGRP_SEC; current->section = Entry::MEMBERGRP_SEC;
...@@ -4160,8 +4189,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -4160,8 +4189,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
} }
<NameSpaceDocArg1>"\\"{B}*"\n" { yyLineNr++; } <NameSpaceDocArg1>"\\"{B}*"\n" { yyLineNr++; }
<NameSpaceDocArg1>"\n" { <NameSpaceDocArg1>"\n" {
warn("Warning: missing argument after " warn(yyFileName,yyLineNr,
"\\namespace at line %d of %s.\n",yyLineNr,yyFileName); "Warning: missing argument after "
"\\namespace."
);
yyLineNr++; yyLineNr++;
} }
<ClassDocArg1>{SCOPENAME}/"<" { <ClassDocArg1>{SCOPENAME}/"<" {
...@@ -4185,8 +4216,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -4185,8 +4216,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
} }
<ClassDocArg1>"\\"{B}*"\n" { yyLineNr++; } <ClassDocArg1>"\\"{B}*"\n" { yyLineNr++; }
<ClassDocArg1>"\n" { <ClassDocArg1>"\n" {
warn("Warning: missing argument after " warn(yyFileName,yyLineNr,
"\\class at line %d of %s.\n",yyLineNr,yyFileName); "Warning: missing argument after "
"\\class."
);
yyLineNr++; yyLineNr++;
} }
...@@ -4198,8 +4231,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -4198,8 +4231,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
} }
<GroupDocArg1>"\\"{B}*"\n" { yyLineNr++; } <GroupDocArg1>"\\"{B}*"\n" { yyLineNr++; }
<GroupDocArg1>"\n" { <GroupDocArg1>"\n" {
warn("Warning: missing argument after " warn(yyFileName,yyLineNr,
"\\defgroup at line %d of %s.\n",yyLineNr,yyFileName); "Warning: missing argument after "
"\\defgroup."
);
yyLineNr++; yyLineNr++;
BEGIN( Doc ); BEGIN( Doc );
} }
...@@ -4252,8 +4287,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -4252,8 +4287,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
} }
<PageDocArg1>"\\"{B}*"\n" { yyLineNr++; } <PageDocArg1>"\\"{B}*"\n" { yyLineNr++; }
<PageDocArg1>"\n" { <PageDocArg1>"\n" {
warn("Warning: missing argument after " warn(yyFileName,yyLineNr,
"\\page at line %d of %s.\n",yyLineNr,yyFileName); "Warning: missing argument after "
"\\page."
);
yyLineNr++; yyLineNr++;
BEGIN( Doc ); BEGIN( Doc );
} }
...@@ -4272,8 +4309,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -4272,8 +4309,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
} }
<EnumDocArg1>"\\"{B}*"\n" { yyLineNr++; } <EnumDocArg1>"\\"{B}*"\n" { yyLineNr++; }
<EnumDocArg1>"\n" { <EnumDocArg1>"\n" {
warn("Warning: missing argument after " warn(yyFileName,yyLineNr,
"\\enum at line %d of %s.\n",yyLineNr,yyFileName); "Warning: missing argument after \\enum."
);
yyLineNr++; yyLineNr++;
BEGIN( Doc ); BEGIN( Doc );
} }
...@@ -4507,6 +4545,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -4507,6 +4545,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
lineCount(); lineCount();
BEGIN( GroupName ); BEGIN( GroupName );
} }
<ClassDoc,LineDoc,Doc,JavaDoc>{CMD}"nosubgrouping"/[^a-z_A-Z0-9] {
current->subGrouping = FALSE;
}
<GroupName>{ID} { <GroupName>{ID} {
current->groups->append( current->groups->append(
new QCString(yytext) new QCString(yytext)
...@@ -4696,9 +4737,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"") ...@@ -4696,9 +4737,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
} }
<ClassDocRelates,ClassDocFunc,ClassDocDefine,GroupDocArg1,ClassDocArg1,SectionTitle,EnumDocArg1,PageDocArg1,ExampleDocArg1,ClassDefineArgs,GroupName>"*/" { <ClassDocRelates,ClassDocFunc,ClassDocDefine,GroupDocArg1,ClassDocArg1,SectionTitle,EnumDocArg1,PageDocArg1,ExampleDocArg1,ClassDefineArgs,GroupName>"*/" {
current->doc += "\n\n"; current->doc += "\n\n";
err("Warning: unexpected end of " warn(yyFileName,yyLineNr,
"documentation block found in " "Warning: unexpected end of "
"file %s at line %d\n",yyFileName,yyLineNr); "documentation block."
);
BEGIN( lastDocContext ); BEGIN( lastDocContext );
} }
<FileDocArg1>"*/" { <FileDocArg1>"*/" {
...@@ -4905,27 +4947,13 @@ void parseDocument(OutputList &ol,const QCString &docString) ...@@ -4905,27 +4947,13 @@ void parseDocument(OutputList &ol,const QCString &docString)
if (inBlock()) endBlock(); if (inBlock()) endBlock();
if (currentListIndentLevel>0) if (currentListIndentLevel>0)
{ {
if (!refName.isEmpty()) warn(yyFileName,yyLineNr,"Warning: Documentation ended in the middle "
{ "of a list (indent level %d)!",currentListIndentLevel);
warn("Warning: Documentation block of %s ended in the middle "
"of a list (indent level %d)!\n",refName.data(),
currentListIndentLevel);
}
else if (!exampleName.isEmpty())
{
warn("Warning: Documentation block of %s ended in the middle "
"of a list (indent level %d)!\n",exampleName.data(),
currentListIndentLevel);
}
else
{
warn("Warning: Documentation block ended in the middle "
"of a list (indent level %d)!\n",currentListIndentLevel);
}
} }
if (depthIf!=0) if (depthIf!=0)
{ {
warn("Warning: Documentation block contains \\if without matching \\endif: %d\n",depthIf); warn(yyFileName,yyLineNr,"Warning: Documentation block contains \\if "
"without matching \\endif: nesting level is %d",depthIf);
} }
if (!tableStack.isEmpty()) if (!tableStack.isEmpty())
{ {
...@@ -4933,7 +4961,9 @@ void parseDocument(OutputList &ol,const QCString &docString) ...@@ -4933,7 +4961,9 @@ void parseDocument(OutputList &ol,const QCString &docString)
} }
if (insideVerbatim) if (insideVerbatim)
{ {
warn("Warning: file ended inside a \\verbatim block!\n"); warn(yyFileName,yyLineNr,
"Warning: file ended inside a \\verbatim block!"
);
} }
ol+=*outDoc; ol+=*outDoc;
delete outDoc; outDoc=0; delete outDoc; outDoc=0;
...@@ -4942,27 +4972,17 @@ void parseDocument(OutputList &ol,const QCString &docString) ...@@ -4942,27 +4972,17 @@ void parseDocument(OutputList &ol,const QCString &docString)
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------
void parseDoc(OutputList &ol,const char *clName, void parseDoc(OutputList &ol,const char *fileName,int startLine,
const char *memName,const QCString &docString) const char *clName,const char *memName,const QCString &docString)
{ {
//printf("Doc---------\n%s\n---------\n",docString.data()); //printf("parseDoc(file=`%s',line=%d)\n",fileName,startLine);
initParser(); initParser();
initParseCodeContext(); initParseCodeContext();
exampleDoc=FALSE; // do not cross reference with member docs exampleDoc=FALSE; // do not cross reference with member docs
className=clName; className=clName;
memberName=memName; memberName=memName;
if (memName) strcpy(yyFileName,fileName);
{ yyLineNr = startLine;
refName=className+"::"+memberName;
}
else if (clName)
{
refName=className;
}
else
{
refName="<unknown>";
}
parseDocument(ol,docString); parseDocument(ol,docString);
} }
...@@ -4992,7 +5012,7 @@ void parseExample(OutputList &ol,const QCString &docString, ...@@ -4992,7 +5012,7 @@ void parseExample(OutputList &ol,const QCString &docString,
initParseCodeContext(); initParseCodeContext();
exampleDoc=TRUE; // cross reference with member docs exampleDoc=TRUE; // cross reference with member docs
exampleName=fileName; exampleName=fileName;
refName="example "+exampleName; strcpy(yyFileName,fileName);
parseDocument(ol,docString); parseDocument(ol,docString);
} }
......
...@@ -54,7 +54,7 @@ static void addClass(const char *name,const char *fileName) ...@@ -54,7 +54,7 @@ static void addClass(const char *name,const char *fileName)
//printf("adding class %s\n",name); //printf("adding class %s\n",name);
if (name!=0 && strlen(name)>0 && classDict[name]==0) if (name!=0 && strlen(name)>0 && classDict[name]==0)
{ {
cd = new ClassDef(name,ClassDef::Class,tagName,fileName); cd = new ClassDef(fileName,1,name,ClassDef::Class,tagName,fileName);
fd = 0; fd = 0;
nd = 0; nd = 0;
classList.inSort(cd); classList.inSort(cd);
...@@ -92,7 +92,7 @@ static void addNamespace(const char *name) ...@@ -92,7 +92,7 @@ static void addNamespace(const char *name)
// since namespace are open, this need not to be the case. As a result // since namespace are open, this need not to be the case. As a result
// namespace may contain members that are located in // namespace may contain members that are located in
// different namespaces! // different namespaces!
nd = new NamespaceDef(name,tagName); nd = new NamespaceDef("<tagfile>",1,name,tagName);
namespaceList.inSort(nd); namespaceList.inSort(nd);
namespaceDict.insert(name,nd); namespaceDict.insert(name,nd);
} }
...@@ -110,7 +110,8 @@ static void addMember(const char *name,const char *anchor,const char *args) ...@@ -110,7 +110,8 @@ static void addMember(const char *name,const char *anchor,const char *args)
MemberDef *md; MemberDef *md;
ArgumentList *argList = new ArgumentList; ArgumentList *argList = new ArgumentList;
stringToArgumentList(args,argList); stringToArgumentList(args,argList);
md=new MemberDef(0,name,args,0,Public,Normal,FALSE,FALSE, md=new MemberDef("<tagfile>",1,
0,name,args,0,Public,Normal,FALSE,FALSE,
MemberDef::Function,0,argList); MemberDef::Function,0,argList);
delete argList; delete argList;
md->setAnchor(anchor); md->setAnchor(anchor);
......
...@@ -793,7 +793,7 @@ class Translator ...@@ -793,7 +793,7 @@ class Translator
/*! Text shown before a multi-line variable/enum initialization */ /*! Text shown before a multi-line variable/enum initialization */
virtual QCString trInitialValue() virtual QCString trInitialValue()
{ {
return "Initial value:"; return "Initializer:";
} }
/*! Text used the source code in the file index */ /*! Text used the source code in the file index */
virtual QCString trCode() virtual QCString trCode()
......
...@@ -221,7 +221,7 @@ ClassDef *getResolvedClass(const char *name) ...@@ -221,7 +221,7 @@ ClassDef *getResolvedClass(const char *name)
} }
if (count==10) if (count==10)
{ {
warn("Warning: possible recursive typedef dependency detected for %s!\n",name); warn_cont("Warning: possible recursive typedef dependency detected for %s!\n",name);
return classDict[name]; return classDict[name];
} }
else else
...@@ -734,7 +734,7 @@ QCString fileToString(const char *name) ...@@ -734,7 +734,7 @@ QCString fileToString(const char *name)
QFileInfo fi(name); QFileInfo fi(name);
if (!fi.exists() || !fi.isFile()) if (!fi.exists() || !fi.isFile())
{ {
warn("Error: file `%s' not found\n",name); err("Error: file `%s' not found\n",name);
return ""; return "";
} }
f.setName(name); f.setName(name);
...@@ -742,7 +742,7 @@ QCString fileToString(const char *name) ...@@ -742,7 +742,7 @@ QCString fileToString(const char *name)
} }
if (!fileOpened) if (!fileOpened)
{ {
warn("Error: cannot open file `%s' for reading\n",name); err("Error: cannot open file `%s' for reading\n",name);
return ""; return "";
} }
int fsize=f.size(); int fsize=f.size();
...@@ -2086,8 +2086,9 @@ FileDef *findFileDef(const FileNameDict *fnDict,const char *n,bool &ambig) ...@@ -2086,8 +2086,9 @@ FileDef *findFileDef(const FileNameDict *fnDict,const char *n,bool &ambig)
//---------------------------------------------------------------------- //----------------------------------------------------------------------
void showFileDefMatches(const FileNameDict *fnDict,const char *n) QCString showFileDefMatches(const FileNameDict *fnDict,const char *n)
{ {
QCString result;
QCString name=n; QCString name=n;
QCString path; QCString path;
int slashPos=QMAX(name.findRev('/'),name.findRev('\\')); int slashPos=QMAX(name.findRev('/'),name.findRev('\\'));
...@@ -2104,11 +2105,12 @@ void showFileDefMatches(const FileNameDict *fnDict,const char *n) ...@@ -2104,11 +2105,12 @@ void showFileDefMatches(const FileNameDict *fnDict,const char *n)
{ {
if (path.isEmpty() || fd->getPath().right(path.length())==path) if (path.isEmpty() || fd->getPath().right(path.length())==path)
{ {
msg(" %s\n",fd->absFilePath().data()); result+=" %s\n",fd->absFilePath().data();
} }
fd=fn->next(); fd=fn->next();
} }
} }
return result;
} }
//---------------------------------------------------------------------- //----------------------------------------------------------------------
...@@ -2281,11 +2283,15 @@ QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &te ...@@ -2281,11 +2283,15 @@ QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &te
if (!templ.isEmpty() && scope.find('<')==-1) if (!templ.isEmpty() && scope.find('<')==-1)
{ {
int si,pi=0; int si,pi=0;
while ((si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ) ClassDef *cd=0;
&& !getClass(scope.left(si))) while (
{ //printf("Tried `%s'\n",(scope.left(si)+templ).data()); (si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ) &&
pi=si+2; ((cd=getClass(scope.left(si)))==0 || cd->templateArguments()==0)
} )
{
//printf("Tried `%s'\n",(scope.left(si)+templ).data());
pi=si+2;
}
if (si==-1) // not nested => append template specifier if (si==-1) // not nested => append template specifier
{ {
result+=templ; result+=templ;
......
...@@ -65,7 +65,7 @@ extern ClassDef *getClass(const char *key); ...@@ -65,7 +65,7 @@ extern ClassDef *getClass(const char *key);
extern ClassDef *getResolvedClass(const char *key); extern ClassDef *getResolvedClass(const char *key);
extern FileDef *findFileDef(const FileNameDict *fnDict,const char *n, extern FileDef *findFileDef(const FileNameDict *fnDict,const char *n,
bool &ambig); bool &ambig);
extern void showFileDefMatches(const FileNameDict *fnDict,const char *n); extern QCString showFileDefMatches(const FileNameDict *fnDict,const char *n);
extern int guessSection(const char *name); extern int guessSection(const char *name);
extern bool isId(char c); extern bool isId(char c);
extern QCString removeRedundantWhiteSpace(const QCString &s); extern QCString removeRedundantWhiteSpace(const QCString &s);
......
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