summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authordimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2000-05-22 18:35:23 (GMT)
committerdimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2000-05-22 18:35:23 (GMT)
commitf38608d4bec002a5051c860a599dd4d5229a9671 (patch)
tree699a18c9a8c098fc845ba00c7eb093c73b497c5c /src
parent8013b5fe71402e6c6bfd867e348b6cad73bd7386 (diff)
downloadDoxygen-f38608d4bec002a5051c860a599dd4d5229a9671.zip
Doxygen-f38608d4bec002a5051c860a599dd4d5229a9671.tar.gz
Doxygen-f38608d4bec002a5051c860a599dd4d5229a9671.tar.bz2
Release-1.1.3-20000522
Diffstat (limited to 'src')
-rw-r--r--src/classdef.cpp161
-rw-r--r--src/classdef.h12
-rw-r--r--src/code.l38
-rw-r--r--src/config.h6
-rw-r--r--src/config.l142
-rw-r--r--src/definition.cpp12
-rw-r--r--src/definition.h16
-rw-r--r--src/doxygen.cpp344
-rw-r--r--src/doxygen.h10
-rw-r--r--src/entry.cpp2
-rw-r--r--src/entry.h1
-rw-r--r--src/filedef.cpp18
-rw-r--r--src/filedef.h2
-rw-r--r--src/filename.cpp9
-rw-r--r--src/filename.h3
-rw-r--r--src/groupdef.cpp27
-rw-r--r--src/groupdef.h3
-rw-r--r--src/htmlgen.cpp2
-rw-r--r--src/index.cpp45
-rw-r--r--src/latexgen.cpp2
-rw-r--r--src/logos.cpp496
-rw-r--r--src/memberdef.cpp28
-rw-r--r--src/memberdef.h17
-rw-r--r--src/membergroup.cpp22
-rw-r--r--src/membergroup.h1
-rw-r--r--src/memberlist.cpp68
-rw-r--r--src/memberlist.h7
-rw-r--r--src/message.cpp101
-rw-r--r--src/message.h5
-rw-r--r--src/namespacedef.cpp19
-rw-r--r--src/namespacedef.h4
-rw-r--r--src/pre.l12
-rw-r--r--src/rtfgen.cpp4
-rw-r--r--src/scanner.h6
-rw-r--r--src/scanner.l266
-rw-r--r--src/tag.l7
-rw-r--r--src/translator.h2
-rw-r--r--src/util.cpp26
-rw-r--r--src/util.h2
39 files changed, 1119 insertions, 829 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp
index b488214..eeae69e 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -42,8 +42,11 @@ static QCString stripExtension(const char *fName)
}
// constructs a new class definition
-ClassDef::ClassDef(const char *nm,CompoundType ct,const char *ref,const char *fName)
- : Definition(removeRedundantWhiteSpace(nm))
+ClassDef::ClassDef(
+ const char *defFileName,int defLine,
+ const char *nm,CompoundType ct,
+ const char *ref,const char *fName)
+ : Definition(defFileName,defLine,removeRedundantWhiteSpace(nm))
{
//name=n;
if (fName)
@@ -83,6 +86,16 @@ ClassDef::ClassDef(const char *nm,CompoundType ct,const char *ref,const char *fN
memberGroupList = new MemberGroupList;
memberGroupList->setAutoDelete(TRUE);
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
@@ -354,12 +367,14 @@ void ClassDef::insertMember(MemberDef *md,int groupId)
enumValMembers.append(md);
break;
case MemberDef::Function:
- if (md->name()==name() || // constructor
+ if (md->name()==scopelessName || // constructor
(md->name().find('~')!=-1 && // hack to detect destructor
md->name().find("operator")==-1
)
)
+ {
constructors.append(md);
+ }
else
{
if (Config::sortMembersFlag)
@@ -454,6 +469,17 @@ void ClassDef::computeAnchors()
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
void ClassDef::insertUsedFile(const char *f)
{
@@ -524,7 +550,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
OutputList briefOutput(&ol);
if (!briefDescription().isEmpty())
{
- parseDoc(briefOutput,name(),0,briefDescription());
+ parseDoc(briefOutput,defFileName,defLine,name(),0,briefDescription());
ol+=briefOutput;
ol.writeString(" \n");
ol.pushGeneratorState();
@@ -738,7 +764,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
MemberGroup *mg;
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);
}
@@ -856,7 +882,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph();
ol.popGeneratorState();
- parseDoc(ol,name(),0,documentation()+"\n");
+ parseDoc(ol,defFileName,defLine,name(),0,documentation()+"\n");
}
// write examples
if (exampleFlag)
@@ -1149,33 +1175,6 @@ void ClassDef::writeMemberList(OutputList &ol)
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
bool ClassDef::addExample(const char *anchor,const char *nameStr,
@@ -1203,48 +1202,6 @@ bool ClassDef::hasExamples()
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)
{
@@ -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()
{
@@ -1297,33 +1227,6 @@ bool ClassDef::hasNonReferenceSuperClass()
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)
{
//ol.insertMemberAlign();
diff --git a/src/classdef.h b/src/classdef.h
index deeaddc..96e6c7f 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -53,7 +53,9 @@ class ClassDef : public Definition
Interface=Entry::INTERFACE_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();
QCString getOutputFileBase() const { return fileName; }
CompoundType compoundType() const { return compType; }
@@ -115,8 +117,11 @@ class ClassDef : public Definition
{
return usesIntfClassDict;
}
+ void setSubGrouping(bool enabled) { subGrouping = enabled; }
bool visited;
+
+ void distributeMemberGroupDocumentation();
protected:
void addUsedInterfaceClasses(MemberDef *md,const char *typeStr);
@@ -126,6 +131,7 @@ class ClassDef : public Definition
IncludeInfo *incInfo; // header file to refer to
QCString incName; // alternative include file name
QCString memListFileName;
+ QCString scopelessName; // name without any scopes
BaseClassList *inherits;
BaseClassList *inheritedBy;
NamespaceDef *nspace; // the namespace this class is in
@@ -177,6 +183,10 @@ class ClassDef : public Definition
FileDef *fileDef;
UsesClassDict *usesImplClassDict;
UsesClassDict *usesIntfClassDict;
+
+ bool subGrouping; // does this class group its user-grouped members
+ // as a sub-section of the normal (public/protected/..)
+ // groups?
};
struct UsesClassDef
diff --git a/src/code.l b/src/code.l
index 1fd0a91..5e0e724 100644
--- a/src/code.l
+++ b/src/code.l
@@ -1002,10 +1002,10 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
<SkipCxxComment>. {
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');
}
-<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)* {
+<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*"//@"[{}]{B}*\n)? {
g_yyLineNr+=QCString(yytext).contains('\n');
g_code->endCodeLine();
if (g_yyLineNr<g_inputLines)
@@ -1046,6 +1046,40 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"
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
if (Config::stripCommentsFlag)
{
diff --git a/src/config.h b/src/config.h
index 71ac028..3ac0bed 100644
--- a/src/config.h
+++ b/src/config.h
@@ -35,8 +35,6 @@ struct Config
static QCString projectNumber; // the number of the project
static QCString outputDir; // the global output directory
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 extractAllFlag; // gererate docs for all classes flag
static bool extractPrivateFlag; // generate docs for private members flag
@@ -61,6 +59,10 @@ struct Config
static bool sortMembersFlag; // sort members alphabetically?
static int tabSize; // number of spaces in a tab
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 filePatternList; // list of file patterns
static bool recursiveFlag; // scan directories recursively
diff --git a/src/config.l b/src/config.l
index 1f75428..4e13bf0 100644
--- a/src/config.l
+++ b/src/config.l
@@ -40,7 +40,7 @@ void err(const char *fmt, ...)
vfprintf(stderr, fmt, args);
va_end(args);
}
-void warn(const char *fmt, ...)
+void warn_cont(const char *fmt, ...)
{
va_list args;
va_start(args, fmt);
@@ -67,8 +67,6 @@ QCString Config::projectName;
QCString Config::projectNumber;
QCString Config::outputDir;
QCString Config::outputLanguage = "English";
-bool Config::quietFlag = FALSE;
-bool Config::warningFlag = TRUE;
bool Config::noIndexFlag = FALSE;
bool Config::extractAllFlag = FALSE;
bool Config::extractPrivateFlag = FALSE;
@@ -93,6 +91,10 @@ bool Config::inlineInfoFlag = TRUE;
bool Config::sortMembersFlag = TRUE;
int Config::tabSize = 8;
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::filePatternList;
bool Config::recursiveFlag = FALSE;
@@ -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>"OUTPUT_DIRECTORY"[ \t]*"=" { BEGIN(GetString); s=&Config::outputDir; 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>"EXTRACT_ALL"[ \t]*"=" { BEGIN(GetBool); b=&Config::extractAllFlag; }
<Start>"EXTRACT_PRIVATE"[ \t]*"=" { BEGIN(GetBool); b=&Config::extractPrivateFlag; }
@@ -231,6 +231,10 @@ static int yyread(char *buf,int max_size)
<Start>"SORT_MEMBER_DOCS"[ \t]*"=" { BEGIN(GetBool); b=&Config::sortMembersFlag; }
<Start>"TAB_SIZE"[ \t]*"=" { BEGIN(GetString); s=&tabSizeString; s->resize(0); }
<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>"FILE_PATTERNS"[ \t]*"=" { BEGIN(GetStrList); l=&Config::filePatternList; l->clear(); elemStr=""; }
<Start>"RECURSIVE"[ \t]*"=" { BEGIN(GetBool); b=&Config::recursiveFlag; }
@@ -354,7 +358,7 @@ static int yyread(char *buf,int max_size)
else
{
*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",
bs.data(),yyLineNr);
}
@@ -381,8 +385,6 @@ void dumpConfig()
printf("projectNumber=`%s'\n",Config::projectNumber.data());
printf("outputDir=`%s'\n",Config::outputDir.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("extractAllFlag=`%d'\n",Config::extractAllFlag);
printf("extractPrivateFlag=`%d'\n",Config::extractPrivateFlag);
@@ -421,6 +423,11 @@ void dumpConfig()
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");
{
char *is=Config::inputSources.first();
@@ -586,8 +593,6 @@ void Config::init()
Config::projectNumber.resize(0);
Config::outputDir.resize(0);
Config::outputLanguage = "English";
- Config::quietFlag = FALSE;
- Config::warningFlag = TRUE;
Config::noIndexFlag = FALSE;
Config::extractAllFlag = FALSE;
Config::extractPrivateFlag = FALSE;
@@ -612,6 +617,10 @@ void Config::init()
Config::sortMembersFlag = TRUE;
Config::tabSize = 8;
Config::sectionFilterList.clear();
+ Config::quietFlag = FALSE;
+ Config::warningFlag = TRUE;
+ Config::warningUndocFlag = TRUE;
+ Config::warnFormat = "$file:$line: $text";
Config::inputSources.clear();
Config::filePatternList.clear();
Config::recursiveFlag = FALSE;
@@ -705,7 +714,7 @@ static void writeStringList(QTextStream &t,QStrList &l)
const char *s=p;
bool hasBlanks=FALSE;
while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t');
- if (!first) t << " ";
+ if (!first) t << " ";
first=FALSE;
if (hasBlanks) t << "\"" << s << "\""; else t << s;
p = l.next();
@@ -787,27 +796,6 @@ void writeTemplateConfig(QFile *f,bool 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 << "# The DISABLE_INDEX tag can be used to turn on/off the condensed index at \n";
t << "# top of each HTML page. The value NO (the default) enables the index and \n";
t << "# the value YES disables it. \n";
@@ -1073,6 +1061,57 @@ void writeTemplateConfig(QFile *f,bool sl)
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 << "#---------------------------------------------------------------------------\n";
if (!sl)
@@ -1777,7 +1816,7 @@ void configStrToVal()
int ts = tabSizeString.toInt(&ok);
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;
}
Config::tabSize = ts;
@@ -1793,7 +1832,7 @@ void configStrToVal()
int cols = colsInAlphaIndexString.toInt(&ok);
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");
cols = 5;
}
@@ -1830,7 +1869,8 @@ static void substEnvVarsInStrList(QStrList &sl)
if (!wasQuoted) /* as a result of the expansion, a single string
may have expanded into a list, which we'll
add to sl. If the orginal string already
- contained multiple elements no splitting is done! */
+ contained multiple elements no further
+ splitting is done to allow quoted items with spaces! */
{
@@ -1843,10 +1883,10 @@ static void substEnvVarsInStrList(QStrList &sl)
{
char c;
// skip until start of new word
- for (;i<l && ((c=result.at(i))==' ' || c=='\t');i++)
- p=i; // p marks the start index of the word
+ while (i<l && ((c=result.at(i))==' ' || c=='\t')) i++;
+ p=i; // p marks the start index of the 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 (c=='"') // word within quotes
@@ -1909,6 +1949,7 @@ void substituteEnvironmentVars()
substEnvVarsInString( Config::outputLanguage );
substEnvVarsInStrList( Config::stripFromPath );
substEnvVarsInStrList( Config::sectionFilterList );
+ substEnvVarsInString( Config::warnFormat );
substEnvVarsInStrList( Config::inputSources );
substEnvVarsInStrList( Config::filePatternList );
substEnvVarsInStrList( Config::excludeSources );
@@ -1949,6 +1990,29 @@ void checkConfig()
// 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
if (Config::manExtension.isEmpty())
@@ -2240,7 +2304,7 @@ void checkConfig()
QFileInfo fi(Config::perlPath);
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",
Config::perlPath.data());
}
diff --git a/src/definition.cpp b/src/definition.cpp
index b6c3bd4..9bc88b2 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -25,9 +25,17 @@
#include "outputlist.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()
diff --git a/src/definition.h b/src/definition.h
index e5f125d..e9c6d15 100644
--- a/src/definition.h
+++ b/src/definition.h
@@ -25,12 +25,14 @@ class FileDef;
class OutputList;
class SectionList;
-/*! The common base class of all definitions. */
+/*! The common base class of all entity definitions found in the sources. */
class Definition
{
public:
/*! 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 */
virtual ~Definition();
/*! returns the name of the definition */
@@ -92,17 +94,27 @@ class Definition
FileDef *getBodyDef() { return bodyDef; }
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:
int startBodyLine; // line number of the start of the definition
int endBodyLine; // line number of the end of the definition
FileDef *bodyDef; // file definition containing the function body
+ // where the item was found
+ QCString defFileName;
+ int defLine;
+
private:
QCString n; // name of the definition
QCString brief; // brief description
QCString doc; // detailed description
QCString ref; // reference to external documentation
SectionList *sectionList; // list of all sections
+
};
#endif
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 40a21f8..13fdbbe 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -183,13 +183,14 @@ void buildGroupList(Entry *root)
if ((gd=groupDict[root->name]))
{
- warn("Warning: group %s already documented\n"
- " skipping documentation in file %s at line %d\n",
- root->name.data(),root->fileName.data(),root->startLine);
+ warn(root->fileName,root->startLine,
+ "Warning: group %s already documented. "
+ "Skipping documentation.",
+ root->name.data());
}
else
{
- gd = new GroupDef(root->name,root->type);
+ gd = new GroupDef(root->fileName,root->startLine,root->name,root->type);
gd->setBriefDescription(root->brief);
gd->setDocumentation(root->doc);
gd->addSectionsToDefinition(root->anchors);
@@ -253,9 +254,12 @@ void buildFileList(Entry *root)
if ((!root->doc.isEmpty() && !fd->documentation().isEmpty()) ||
(!root->brief.isEmpty() && !fd->briefDescription().isEmpty()))
{
- warn("Warning: file %s already documented\n"
- " skipping documentation in file %s at line %d\n",
- root->name.data(),root->fileName.data(),root->startLine);
+ warn(
+ root->fileName,root->startLine,
+ "Warning: file %s already documented. "
+ "Skipping documentation.",
+ root->name.data()
+ );
}
else
{
@@ -281,21 +285,23 @@ void buildFileList(Entry *root)
else
{
const char *fn = root->fileName.data();
- warn("Warning: the name `%s' supplied as "
- "the second argument in the \\file statement in file "
- "%s at line %d ",
- root->name.data(),
- fn ? fn : "???",
- root->startLine);
+ QCString text;
+ text.sprintf("Warning: the name `%s' supplied as "
+ "the second argument in the \\file statement.",
+ root->name.data()
+ );
if (ambig) // name is ambigious
{
- warn("matches the following input files:\n");
- showFileDefMatches(&inputNameDict,root->name);
- warn("Please use a more specific name by "
- "including a (larger) part of the path!\n");
+ text+="matches the following input files:\n";
+ text+=showFileDefMatches(&inputNameDict,root->name);
+ text+="Please use a more specific name by "
+ "including a (larger) part of the path!";
}
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);
@@ -325,21 +331,23 @@ static void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
(fd=findFileDef(&inputNameDict,root->includeFile,ambig))==0
)
{ // explicit request
- warn("Warning: the name `%s' supplied as "
- "the second argument in the \\class statement in file "
- "%s at line %d ",
- root->includeFile.data(),
- root->fileName.data(),
- root->startLine);
+ QCString text;
+ text.sprintf("Warning: the name `%s' supplied as "
+ "the second argument in the \\class statement.",
+ root->includeFile.data()
+ );
if (ambig) // name is ambigious
{
- warn("matches the following input files:\n");
- showFileDefMatches(&inputNameDict,root->includeFile);
- warn("Please use a more specific name by "
- "including a (larger) part of the path!\n");
+ text+="matches the following input files:\n";
+ text+=showFileDefMatches(&inputNameDict,root->includeFile);
+ text+="Please use a more specific name by "
+ "including a (larger) part of the path!";
}
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 &&
// see if the file extension makes sense
@@ -424,8 +432,9 @@ void buildClassList(Entry *root)
if (fullName.isEmpty())
{
// this should not be called
- warn("Warning: invalid class found in file %s at %d\n",
- root->fileName.data(),root->startLine);
+ warn(root->fileName,root->startLine,
+ "Warning: invalid class name found!"
+ );
}
else
{
@@ -452,9 +461,12 @@ void buildClassList(Entry *root)
{
if (!root->doc.isEmpty() && !cd->documentation().isEmpty())
{
- warn("Warning: class %s already has a detailed description\n"
- " skipping the one in file %s at line %d\n",
- fullName.data(),root->fileName.data(),root->startLine);
+ warn(
+ root->fileName,root->startLine,
+ "Warning: class %s already has a detailed description. "
+ "Skipping the one found here.",
+ fullName.data()
+ );
}
else if (!root->doc.isEmpty())
{
@@ -462,9 +474,12 @@ void buildClassList(Entry *root)
}
if (!root->brief.isEmpty() && !cd->briefDescription().isEmpty())
{
- warn("Warning: class %s already has a brief description\n"
- " skipping the one in file %s at line %d\n",
- fullName.data(),root->fileName.data(),root->startLine);
+ warn(
+ root->fileName,root->startLine,
+ "Warning: class %s already has a brief description\n"
+ " skipping the one found here.",
+ fullName.data()
+ );
}
else if (!root->brief.isEmpty())
{
@@ -494,6 +509,7 @@ void buildClassList(Entry *root)
fd->insertClass(cd);
}
addClassToGroups(root,cd);
+ if (!root->subGrouping) cd->setSubGrouping(FALSE);
}
else // new class
{
@@ -520,7 +536,7 @@ void buildClassList(Entry *root)
//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->setBriefDescription(root->brief);
//printf("new ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data());
@@ -530,6 +546,7 @@ void buildClassList(Entry *root)
// file definition containing the class cd
cd->setBodySegment(root->bodyLine,root->endBodyLine);
cd->setBodyDef(fd);
+ if (!root->subGrouping) cd->setSubGrouping(FALSE);
addClassToGroups(root,cd);
@@ -614,9 +631,11 @@ void buildNamespaceList(Entry *root)
}
else if (!nd->documentation().isEmpty() && !root->doc.isEmpty())
{
- warn("Warning: namespace %s already has a detailed description,\n"
- " skipping documentation in file %s at line %d\n",
- fullName.data(),root->fileName.data(),root->startLine);
+ warn(
+ root->fileName,root->startLine,
+ "Warning: namespace %s already has a detailed description. "
+ "Skipping the documentation found here.",
+ fullName.data());
}
if (nd->briefDescription().isEmpty() && !root->brief.isEmpty())
{
@@ -625,9 +644,11 @@ void buildNamespaceList(Entry *root)
}
else if (!nd->briefDescription().isEmpty() && !root->brief.isEmpty())
{
- warn("Warning: namespace %s already has a brief description,\n"
- " skipping documentation in file %s at line %d\n",
- fullName.data(),root->fileName.data(),root->startLine);
+ warn(root->fileName,root->startLine,
+ "Warning: namespace %s already has a brief description. "
+ "Skipping the documentation found here.",
+ fullName.data()
+ );
}
}
@@ -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->setBriefDescription(root->brief);
nd->addSectionsToDefinition(root->anchors);
@@ -739,7 +760,8 @@ void findUsingDirectives(Entry *root)
}
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->setBriefDescription(root->brief);
nd->addSectionsToDefinition(root->anchors);
@@ -846,12 +868,14 @@ static MemberDef *addVariableToClass(
}
}
// 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,
mtype,0,0);
md->setMemberClass(cd);
- md->setDefFile(root->fileName);
- md->setDefLine(root->startLine);
+ //md->setDefFile(root->fileName);
+ //md->setDefLine(root->startLine);
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->setDefinition(def);
@@ -912,11 +936,13 @@ static MemberDef *addVariableToFile(
);
// 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,
mtype,0,0);
- md->setDefFile(root->fileName);
- md->setDefLine(root->startLine);
+ //md->setDefFile(root->fileName);
+ //md->setDefLine(root->startLine);
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->addSectionsToDefinition(root->anchors);
@@ -1260,12 +1286,14 @@ void buildMemberList(Entry *root)
// new member function, signal or slot.
//printf("new member: %s class template args=`%s'\n",
// root->args.data(),argListToString(cd->templateArguments()).data());
- MemberDef *md=new MemberDef(root->type,name,root->args,root->exception,
- root->protection,root->virt,root->stat,!root->relates.isEmpty(),
- mtype,root->mtArgList,root->argList);
+ MemberDef *md=new MemberDef(
+ root->fileName,root->startLine,
+ 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->setDefFile(root->fileName);
- md->setDefLine(root->startLine);
+ //md->setDefFile(root->fileName);
+ //md->setDefLine(root->startLine);
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->setBodySegment(root->bodyLine,root->endBodyLine);
@@ -1425,11 +1453,13 @@ void buildMemberList(Entry *root)
// new global function
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,
MemberDef::Function,root->tArgList,root->argList);
- md->setDefFile(root->fileName);
- md->setDefLine(root->startLine);
+ //md->setDefFile(root->fileName);
+ //md->setDefLine(root->startLine);
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
md->setPrototype(root->proto);
@@ -1538,8 +1568,9 @@ void buildMemberList(Entry *root)
}
else if (root->name.isEmpty())
{
- warn("Warning: Illegal member name found in file %s at line %d\n",
- root->fileName.data(),root->startLine);
+ warn(root->fileName,root->startLine,
+ "Warning: Illegal member name found."
+ );
}
}
EntryListIterator eli(*root->sublist);
@@ -1819,7 +1850,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
else if (insertUndocumented)
{
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
cd->insertBaseClass(baseClass,bi->prot,bi->virt,templSpec);
// add this class as super class to the base class
@@ -1912,10 +1943,11 @@ void computeClassRelations(Entry *root)
else if (bName.right(2)!="::")
{
if (!root->name.isEmpty() && root->name[0]!='@')
- warn("Warning: Compound %s\n"
- " defined in file %s at line %d\n"
- " is not documented\n",
- root->name.data(),root->fileName.data(),root->startLine);
+ warn_undoc(
+ root->fileName,root->startLine,
+ "Warning: Compound %s is not documented.",
+ root->name.data()
+ );
}
}
EntryListIterator eli(*root->sublist);
@@ -2055,8 +2087,8 @@ void addMemberDocs(Entry *root,
md->setBodyDef(fd);
}
}
- md->setDefFile(root->fileName);
- md->setDefLine(root->startLine);
+ //md->setDefFile(root->fileName);
+ //md->setDefLine(root->startLine);
if (root->inLine && !md->isInline()) md->setInline(TRUE);
md->addSectionsToDefinition(root->anchors);
addMemberToGroups(root,md);
@@ -2067,9 +2099,12 @@ void addMemberDocs(Entry *root,
{
if (md->getMemberGroup()->groupId()!=root->mGrpId)
{
- warn("Warning: member %s belongs to two different group. The second "
- "one is found at line %d of %s and will be ignored\n",
- md->name().data(),root->startLine,root->fileName.data());
+ warn(
+ root->fileName,root->startLine,
+ "Warning: member %s belongs to two different groups. The second "
+ "one found here will be ignored.",
+ md->name().data()
+ );
}
}
else // set group id
@@ -2184,16 +2219,15 @@ static bool findUnrelatedFunction(Entry *root,
}
if (!found) // no match
{
- warn("Warning: no matching member found for \n%s\n"
- "in file %s at line %d\n",
- decl,root->fileName.data(),root->startLine);
+ warn(root->fileName,root->startLine,
+ "Warning: no matching member found for \n%s",decl);
}
}
else // got docs for an undefined member!
{
- warn("Warning: documented function `%s'\nin file %s at line %d "
- "was not defined \n",decl,
- root->fileName.data(),root->startLine);
+ warn(root->fileName,root->startLine,
+ "Warning: documented function `%s' was not defined.",decl
+ );
}
return TRUE;
}
@@ -2771,9 +2805,10 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
}
}
if (count==0 && !(isFriend && funcType=="class"))
- warn("Warning: no matching member found for \n%s\n"
- "in file %s at line %d\n",
- fullFuncDecl.data(),root->fileName.data(),root->startLine);
+ warn(root->fileName,root->startLine,
+ "Warning: no matching member found for \n%s",
+ fullFuncDecl.data()
+ );
#if 0
else if (count>1)
{
@@ -2828,9 +2863,11 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
else mtype=MemberDef::Function;
// new overloaded member function
- MemberDef *md=new MemberDef(funcType,funcName,funcArgs,exceptions,
- root->protection,root->virt,root->stat,TRUE,
- mtype,root->tArgList,root->argList);
+ MemberDef *md=new MemberDef(
+ root->fileName,root->startLine,
+ funcType,funcName,funcArgs,exceptions,
+ root->protection,root->virt,root->stat,TRUE,
+ mtype,root->tArgList,root->argList);
md->setMemberClass(cd);
md->setDefinition(funcDecl);
QCString doc=getOverloadDocs();
@@ -2839,8 +2876,8 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
md->setDocumentation(doc);
//md->setDecFile(root->fileName);
//md->setDecLine(root->startLine);
- md->setDefFile(root->fileName);
- md->setDefLine(root->startLine);
+ //md->setDefFile(root->fileName);
+ //md->setDefLine(root->startLine);
md->setPrototype(root->proto);
md->addSectionsToDefinition(root->anchors);
//if (root->mGrpId!=-1)
@@ -2862,9 +2899,10 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
{
if (!findUnrelatedFunction(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
{
- warn("Warning: Cannot determine class for function\n%s\n"
- "in file %s at line %d\n",fullFuncDecl.data(),
- root->fileName.data(),root->startLine);
+ warn(root->fileName,root->startLine,
+ "Warning: Cannot determine class for function\n%s",
+ fullFuncDecl.data()
+ );
}
}
}
@@ -2908,7 +2946,9 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
mtype=MemberDef::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,
mtype,root->tArgList,root->argList);
//printf("Related member name=`%s' decl=`%s' bodyLine=`%d'\n",
@@ -2959,8 +2999,8 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
md->setMemberClass(cd);
md->setInline(root->inLine);
md->setDefinition(funcDecl);
- md->setDefFile(root->fileName);
- md->setDefLine(root->startLine);
+ //md->setDefFile(root->fileName);
+ //md->setDefLine(root->startLine);
md->setPrototype(root->proto);
md->setDocumentation(root->doc);
md->setBriefDescription(root->brief);
@@ -2978,8 +3018,11 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
}
else
{
- warn("Warning: class `%s' for related function `%s' is not "
- "documented\n", className.data(),funcName.data());
+ warn_undoc(root->fileName,root->startLine,
+ "Warning: class `%s' for related function `%s' is not "
+ "documented.",
+ className.data(),funcName.data()
+ );
}
}
else // unrelated not overloaded member found
@@ -2987,17 +3030,18 @@ void findMember(Entry *root,QCString funcDecl,QCString related,bool overloaded,
if (className.isEmpty() &&
!findUnrelatedFunction(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
{
- warn("Warning: class for member %s (file %s at line %d) cannot "
- "be found\n", funcName.data(),root->fileName.data(),
- root->startLine);
+ warn(root->fileName,root->startLine,
+ "Warning: class for member %s cannot "
+ "be found.", funcName.data()
+ );
}
}
}
else
{
// this should not be called
- warn("Warning: member with no name found in %s at line %d\n",
- root->fileName.data(),root->startLine);
+ warn(root->fileName,root->startLine,
+ "Warning: member with no name found.");
}
return;
}
@@ -3164,11 +3208,13 @@ void findEnums(Entry *root)
if (!name.isEmpty())
{
// new enum type
- md = new MemberDef(0,name,0,0,root->protection,Normal,FALSE,FALSE,
- MemberDef::Enumeration,0,0);
+ md = new MemberDef(
+ 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);
- md->setDefFile(root->fileName);
- md->setDefLine(root->startLine);
+ //md->setDefFile(root->fileName);
+ //md->setDefLine(root->startLine);
md->setBodySegment(root->bodyLine,root->endBodyLine);
bool ambig;
md->setBodyDef(findFileDef(&inputNameDict,root->fileName,ambig));
@@ -3360,9 +3406,10 @@ void findEnumDocumentation(Entry *root)
}
if (!found)
{
- warn("Warning: Documentation for undefined enum `%s' found at"
- " line %d of file %s\n",name.data(),
- root->startLine,root->fileName.data());
+ warn(root->fileName,root->startLine,
+ "Warning: Documentation for undefined enum `%s' found.",
+ name.data()
+ );
}
}
}
@@ -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)
{
if ((root->section==Entry::DEFINEDOC_SEC ||
@@ -3833,8 +3919,10 @@ void findDefineDocumentation(Entry *root)
}
else if (!root->doc.isEmpty() || !root->brief.isEmpty()) // define not found
{
- warn("Warning: documentation for unknown define %s found at line %d of "
- "file %s\n",root->name.data(),root->startLine,root->fileName.data());
+ warn(root->fileName,root->startLine,
+ "Warning: documentation for unknown define %s found.\n",
+ root->name.data()
+ );
}
}
EntryListIterator eli(*root->sublist);
@@ -3873,7 +3961,8 @@ void buildPageList(Entry *root)
baseName=baseName.left(baseName.length()-4);
else if (baseName.right(5)==".html")
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());
QCString pageName;
if (Config::caseSensitiveNames)
@@ -3914,14 +4003,17 @@ void findMainPage(Entry *root)
if (mainPage==0)
{
//printf("Found main page! \n======\n%s\n=======\n",root->doc.data());
- mainPage = new PageInfo("index", root->doc,
- root->args.stripWhiteSpace());
+ mainPage = new PageInfo(root->fileName,root->startLine,
+ "index", root->doc,
+ root->args.stripWhiteSpace());
setFileNameForSections(root->anchors,"index");
}
else
{
- warn("Warning: found more than one \\mainpage comment block!\n Skipping the "
- "block at line %d of %s\n",root->startLine,root->fileName.data());
+ warn(root->fileName,root->startLine,
+ "Warning: found more than one \\mainpage comment block! Skipping this "
+ "block."
+ );
}
}
EntryListIterator eli(*root->sublist);
@@ -3995,7 +4087,7 @@ void generatePageDocs()
outputList->writeSection(si->label,si->title,FALSE);
}
outputList->startTextBlock();
- parseDoc(*outputList,0,0,pi->doc);
+ parseDoc(*outputList,pi->defFileName,pi->defLine,0,0,pi->doc);
outputList->endTextBlock();
endFile(*outputList);
outputList->enable(OutputGenerator::Man);
@@ -4014,13 +4106,16 @@ void buildExampleList(Entry *root)
{
if (exampleDict[root->name])
{
- warn("Warning: Example %s was already documented. Ignoring "
- "documentation at line %d of %s\n",root->name.data(),
- root->startLine,root->fileName.data());
+ warn(root->fileName,root->startLine,
+ "Warning: Example %s was already documented. Ignoring "
+ "documentation found here.",
+ root->name.data()
+ );
}
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,
convertSlashes(pi->name,TRUE)+"-example"
);
@@ -4340,7 +4435,7 @@ void readTagFile(const char *tl)
QFileInfo fi(fileName);
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());
return;
}
@@ -4457,12 +4552,12 @@ void copyStyleSheet()
}
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
{
- 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
}
}
@@ -4709,7 +4804,7 @@ void readFormulaRepository()
int se=line.find(':'); // find name and text separator.
if (se==-1)
{
- warn("Warning: formula.repository is corrupted!\n");
+ err("Error: formula.repository is corrupted!\n");
break;
}
else
@@ -4969,7 +5064,7 @@ int main(int argc,char **argv)
if (input.isEmpty())
{
- warn("No input read, no output generated!\n");
+ err("No input read, no output generated!\n");
exit(1);
}
else
@@ -5117,6 +5212,9 @@ int main(int argc,char **argv)
inheritDocumentation();
}
+ msg("Distributing member group documentation.\n");
+ distributeMemberGroupDocumentation();
+
/**************************************************************************
* Generate documentation *
**************************************************************************/
diff --git a/src/doxygen.h b/src/doxygen.h
index 93a2a27..fc4b5ea 100644
--- a/src/doxygen.h
+++ b/src/doxygen.h
@@ -36,8 +36,14 @@
struct PageInfo
{
- PageInfo(const char *n,const char *d,const char *t)
- { name=n; doc=d; title=t; }
+ PageInfo(const char *f, int l,const char *n,const char *d,const char *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 doc;
QCString title;
diff --git a/src/entry.cpp b/src/entry.cpp
index 2b4f4ce..e3aaa8d 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -207,6 +207,7 @@ void Entry::reset()
scopeSpec.resize(0);
memberSpec.resize(0);
initializer.resize(0);
+ startLine = 1;
bodyLine = -1;
endBodyLine = -1;
mGrpId = -1;
@@ -217,6 +218,7 @@ void Entry::reset()
stat = FALSE;
proto = FALSE;
inLine = FALSE;
+ subGrouping = TRUE;
protection = Public;
sublist->clear();
extends->clear();
diff --git a/src/entry.h b/src/entry.h
index 4adc374..74eea8f 100644
--- a/src/entry.h
+++ b/src/entry.h
@@ -159,6 +159,7 @@ class Entry
bool stat; // static ?
bool proto; // prototype ?
bool inLine; // inline ?
+ bool subGrouping; // automatically group class members?
Specifier virt; // virtualness of the entry
Entry *parent; // parent node in the tree
QCString type; // member type
diff --git a/src/filedef.cpp b/src/filedef.cpp
index 657f2d9..f7853a7 100644
--- a/src/filedef.cpp
+++ b/src/filedef.cpp
@@ -35,7 +35,7 @@
file was read from a tag file or 0 otherwise
*/
FileDef::FileDef(const char *p,const char *nm,const char *ref)
- : Definition(nm)
+ : Definition((QCString)p+nm,1,nm)
{
path=p;
filepath=path+nm;
@@ -83,6 +83,16 @@ void FileDef::computeAnchors()
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
generators \a ol.
*/
@@ -95,6 +105,8 @@ void FileDef::writeDocumentation(OutputList &ol)
//{
// fn.prepend(stripFromPath(getPath().copy()));
//}
+
+ //printf("WriteDocumentation %p diskname=%s\n",this,diskname.data());
QCString pageTitle=name()+" File Reference";
startFile(ol,diskname,pageTitle);
@@ -113,7 +125,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
//if (brief.at(bl-1)!='.' && brief.at(bl-1)!='!' && brief.at(bl!='?'))
// brief+='.';
- parseDoc(briefOutput,0,0,briefDescription());
+ parseDoc(briefOutput,filepath,1,0,0,briefDescription());
ol+=briefOutput;
ol.writeString(" \n");
ol.disableAllBut(OutputGenerator::Html);
@@ -293,7 +305,7 @@ void FileDef::writeDocumentation(OutputList &ol)
{
//if (doc.at(dl-1)!='.' && doc.at(dl-1)!='!' && doc.at(dl-1)!='?')
// 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());
if (Config::sourceBrowseFlag)
diff --git a/src/filedef.h b/src/filedef.h
index 03ef921..3791473 100644
--- a/src/filedef.h
+++ b/src/filedef.h
@@ -125,6 +125,8 @@ class FileDef : public Definition
QList<IncludeInfo> *includeFileList() const { return includeList; }
QDict<IncludeInfo> *includeFileDict() const { return includeDict; }
+ void distributeMemberGroupDocumentation();
+
private:
MemberList allMemberList;
MemberList defineMembers;
diff --git a/src/filename.cpp b/src/filename.cpp
index 69646ec..6e1fa0a 100644
--- a/src/filename.cpp
+++ b/src/filename.cpp
@@ -55,7 +55,7 @@ void FileName::generateDiskNames()
//printf("Multiple occurrences of %s\n",name.data());
int i=0,j=0;
bool found=FALSE;
- while (!found)
+ while (!found) // search for the common prefix of all paths
{
fd=first();
while (fd && fd->isReference()) fd=next();
@@ -66,7 +66,7 @@ void FileName::generateDiskNames()
{
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())
{
//warning("Warning: Input file %s found multiple times!\n"
@@ -88,8 +88,9 @@ void FileName::generateDiskNames()
//printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data());
if (!fd->isReference())
{
- fd->setName(fd->path.right(fd->path.length()-j-1)+name);
- fd->diskname=convertSlashes(fd->name());
+ QCString prefix = fd->path.right(fd->path.length()-j-1);
+ fd->setName(prefix+name);
+ fd->diskname=convertSlashes(prefix+name);
}
fd=next();
}
diff --git a/src/filename.h b/src/filename.h
index aefacb9..48c73ec 100644
--- a/src/filename.h
+++ b/src/filename.h
@@ -61,7 +61,8 @@ class FileNameListIterator : public QListIterator<FileName>
class FileNameDict : public QDict<FileName>
{
public:
- FileNameDict(uint size) : QDict<FileName>(size) {}
+ FileNameDict(uint size) :
+ QDict<FileName>(size,Config::caseSensitiveNames) {}
~FileNameDict() {}
};
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
index 255c200..0bbe773 100644
--- a/src/groupdef.cpp
+++ b/src/groupdef.cpp
@@ -31,8 +31,8 @@
#include "membergroup.h"
#include "doxygen.h"
-GroupDef::GroupDef(const char *na,const char *t) :
- Definition(na)
+GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t) :
+ Definition(df,dl,na)
{
fileList = new FileList;
classList = new ClassList;
@@ -66,6 +66,16 @@ GroupDef::~GroupDef()
delete memberGroupDict;
}
+void GroupDef::distributeMemberGroupDocumentation()
+{
+ MemberGroupListIterator mgli(*memberGroupList);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->distributeMemberGroupDocumentation();
+ }
+}
+
void GroupDef::addFile(const FileDef *def)
{
fileList->append(def);
@@ -159,7 +169,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
OutputList briefOutput(&ol);
if (!briefDescription().isEmpty())
{
- parseDoc(briefOutput,name(),0,briefDescription());
+ parseDoc(briefOutput,defFileName,defLine,name(),0,briefDescription());
ol+=briefOutput;
ol.writeString(" \n");
ol.pushGeneratorState();
@@ -189,7 +199,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
if (!fd->briefDescription().isEmpty() && Config::briefMemDescFlag)
{
ol.startMemberDescription();
- parseDoc(ol,0,0,fd->briefDescription());
+ parseDoc(ol,defFileName,defLine,0,0,fd->briefDescription());
ol.endMemberDescription();
ol.newParagraph();
}
@@ -214,7 +224,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
if (!nd->briefDescription().isEmpty() && Config::briefMemDescFlag)
{
ol.startMemberDescription();
- parseDoc(ol,0,0,nd->briefDescription());
+ parseDoc(ol,defFileName,defLine,0,0,nd->briefDescription());
ol.endMemberDescription();
ol.newParagraph();
}
@@ -238,7 +248,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
if (!gd->briefDescription().isEmpty() && Config::briefMemDescFlag)
{
ol.startMemberDescription();
- parseDoc(ol,0,0,gd->briefDescription());
+ parseDoc(ol,defFileName,defLine,0,0,gd->briefDescription());
ol.endMemberDescription();
ol.newParagraph();
}
@@ -284,7 +294,7 @@ void GroupDef::writeDocumentation(OutputList &ol)
// write documentation
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)
}
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",
md->name().data(),mgd->name().data(),gd->name().data()
);
diff --git a/src/groupdef.h b/src/groupdef.h
index 03adc17..4f90bb3 100644
--- a/src/groupdef.h
+++ b/src/groupdef.h
@@ -39,7 +39,7 @@ class MemberGroupDict;
class GroupDef : public Definition
{
public:
- GroupDef(const char *name,const char *title);
+ GroupDef(const char *fileName,int line,const char *name,const char *title);
~GroupDef();
QCString getOutputFileBase() const { return fileName; }
const char *groupTitle() const { return title; }
@@ -60,6 +60,7 @@ class GroupDef : public Definition
return isLinkableInProject() || isReference();
}
void computeAnchors();
+ void distributeMemberGroupDocumentation();
private:
QCString title; // title of the group
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 0b58044..1c76c27 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -154,7 +154,7 @@ void HtmlGenerator::writeFooter(int part,bool external)
}
t << "doxygen.gif\" alt=\"doxygen\" "
<< "align=center border=0 " << endl <<
- "width=118 height=53></a> " << versionString <<" ";
+ "width=110 height=53></a>" << versionString <<" ";
}
break;
default:
diff --git a/src/index.cpp b/src/index.cpp
index 86d35c0..6ed094a 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -393,7 +393,8 @@ void writeFileIndex(OutputList &ol)
{
ol.docify(" (");
OutputList briefOutput(&ol);
- parseDoc(briefOutput,0,0,
+ parseDoc(briefOutput,fd->absFilePath(),1,
+ 0,0,
abbreviate(fd->briefDescription(),fd->name()));
ol+=briefOutput;
ol.docify(")");
@@ -432,7 +433,9 @@ void writeFileIndex(OutputList &ol)
{
ol.docify(" (");
OutputList briefOutput(&ol);
- parseDoc(briefOutput,0,0,
+ parseDoc(briefOutput,
+ fd->absFilePath(),1,
+ 0,0,
abbreviate(fd->briefDescription(),fd->name()));
ol+=briefOutput;
ol.docify(")");
@@ -580,8 +583,10 @@ void writeNamespaceIndex(OutputList &ol)
if (!nd->briefDescription().isEmpty())
{
OutputList briefOutput(&ol);
- parseDoc(briefOutput,nd->name(),0,
- abbreviate(nd->briefDescription(),nd->name()));
+ parseDoc(briefOutput,
+ nd->getDefFileName(),nd->getDefLine(),
+ nd->name(),0,
+ abbreviate(nd->briefDescription(),nd->name()));
ol+=briefOutput;
}
else
@@ -654,8 +659,10 @@ void writeAnnotatedClassList(OutputList &ol)
if (!cd->briefDescription().isEmpty())
{
OutputList briefOutput(&ol);
- parseDoc(briefOutput,cd->name(),0,
- abbreviate(cd->briefDescription(),cd->name()));
+ parseDoc(briefOutput,
+ cd->getDefFileName(),cd->getDefLine(),
+ cd->name(),0,
+ abbreviate(cd->briefDescription(),cd->name()));
ol+=briefOutput;
}
else
@@ -1454,10 +1461,15 @@ void writeGroupList(OutputList &ol)
{
ol.startDescItem();
ol.startTextLink(gd->getOutputFileBase(),0);
- parseDoc(ol,0,0,gd->groupTitle());
+ parseDoc(ol,
+ gd->getDefFileName(),gd->getDefLine(),
+ 0,0,
+ gd->groupTitle());
ol.endTextLink();
ol.endDescItem();
- parseDoc(ol,0,0,gd->briefDescription());
+ parseDoc(ol,
+ gd->getDefFileName(),gd->getDefLine(),
+ 0,0,gd->briefDescription());
ol.newParagraph();
}
}
@@ -1517,6 +1529,11 @@ void writeIndex(OutputList &ol)
//ol.disable(OutputGenerator::Latex);
ol.disableAllBut(OutputGenerator::Html);
+ QCString defFileName =
+ mainPage ? mainPage->defFileName.data() : "<generated>";
+ int defLine =
+ mainPage ? mainPage->defLine : 1;
+
if (!mainPage || mainPage->title.isEmpty())
ol.startFile("index","Main Index",FALSE);
else
@@ -1526,7 +1543,7 @@ void writeIndex(OutputList &ol)
ol.startTitleHead(0);
if (mainPage && !mainPage->title.isEmpty())
{
- parseDoc(ol,0,0,mainPage->title);
+ parseDoc(ol,defFileName,defLine,0,0,mainPage->title);
}
else
{
@@ -1537,14 +1554,14 @@ void writeIndex(OutputList &ol)
if (!Config::projectNumber.isEmpty())
{
ol.startProjectNumber();
- parseDoc(ol,0,0,Config::projectNumber);
+ parseDoc(ol,defFileName,defLine,0,0,Config::projectNumber);
ol.endProjectNumber();
}
if (Config::noIndexFlag) writeQuickLinks(ol,FALSE);
if (mainPage)
{
- parseDoc(ol,0,0,mainPage->doc);
+ parseDoc(ol,defFileName,defLine,0,0,mainPage->doc);
}
endFile(ol);
@@ -1565,7 +1582,7 @@ void writeIndex(OutputList &ol)
if (!Config::projectNumber.isEmpty())
{
ol.startProjectNumber();
- parseDoc(ol,0,0,Config::projectNumber);
+ parseDoc(ol,defFileName,defLine,0,0,Config::projectNumber);
ol.endProjectNumber();
}
ol.endIndexSection(isTitlePageStart);
@@ -1577,7 +1594,7 @@ void writeIndex(OutputList &ol)
ol.startIndexSection(isMainPage);
if (!mainPage->title.isEmpty())
{
- parseDoc(ol,0,0,mainPage->title);
+ parseDoc(ol,defFileName,defLine,0,0,mainPage->title);
}
else
{
@@ -1674,7 +1691,7 @@ void writeIndex(OutputList &ol)
ol.writeSection(si->label,si->title,FALSE);
}
ol.startTextBlock();
- parseDoc(ol,0,0,mainPage->doc);
+ parseDoc(ol,defFileName,defLine,0,0,mainPage->doc);
ol.endTextBlock();
endFile(ol);
ol.enable(OutputGenerator::Man);
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index ee822da..671d377 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -596,7 +596,7 @@ void LatexGenerator::writeStyleInfo(int part)
t << "\\newenvironment{CompactItemize}\n";
t << "{\n";
t << " \\begin{itemize}\n";
- t << " \\setlength{\\itemsep}{-4pt}\n";
+ t << " \\setlength{\\itemsep}{-3pt}\n";
t << " \\setlength{\\parsep}{0pt}\n";
t << " \\setlength{\\topsep}{0pt}\n";
t << " \\setlength{\\partopsep}{0pt}\n";
diff --git a/src/logos.cpp b/src/logos.cpp
index d019a92..f598435 100644
--- a/src/logos.cpp
+++ b/src/logos.cpp
@@ -31,303 +31,207 @@ unsigned char null_data[] = {
unsigned int null_len = 43;
unsigned char logo_data[] = {
- 0x47, 0x49, 0x46, 0x38, 0x37, 0x61, 0x76, 0x00, 0x35, 0x00, 0xf7, 0x00,
- 0x00, 0x31, 0x7b, 0x6b, 0x31, 0x7b, 0x73, 0x31, 0x84, 0x7b, 0x31, 0x84,
- 0x84, 0x31, 0x8c, 0x7b, 0x31, 0x8c, 0x84, 0x31, 0x8c, 0x8c, 0x39, 0x7b,
- 0x7b, 0x39, 0x84, 0x7b, 0x39, 0x84, 0x84, 0x39, 0x8c, 0x84, 0x39, 0x94,
- 0x8c, 0x39, 0x94, 0x94, 0x39, 0x9c, 0x94, 0x42, 0x7b, 0x73, 0x42, 0x8c,
- 0x84, 0x42, 0x94, 0x8c, 0x42, 0x9c, 0x8c, 0x42, 0x9c, 0x94, 0x42, 0xa5,
- 0x9c, 0x4a, 0x5a, 0x5a, 0x4a, 0x84, 0x84, 0x4a, 0x8c, 0x84, 0x4a, 0x94,
- 0x8c, 0x4a, 0x94, 0x94, 0x4a, 0x9c, 0x94, 0x4a, 0xa5, 0x94, 0x4a, 0xa5,
- 0x9c, 0x4a, 0xa5, 0xa5, 0x52, 0x52, 0x52, 0x52, 0x73, 0x73, 0x52, 0x7b,
- 0x7b, 0x52, 0x84, 0x84, 0x52, 0x94, 0x8c, 0x52, 0x9c, 0x94, 0x52, 0xa5,
- 0x9c, 0x52, 0xad, 0xa5, 0x52, 0xb5, 0xad, 0x5a, 0x5a, 0x5a, 0x5a, 0x63,
- 0x63, 0x5a, 0x6b, 0x6b, 0x5a, 0x7b, 0x7b, 0x5a, 0x8c, 0x84, 0x5a, 0x8c,
- 0x8c, 0x5a, 0x94, 0x8c, 0x5a, 0x94, 0x94, 0x5a, 0x9c, 0x94, 0x5a, 0xa5,
- 0x9c, 0x5a, 0xa5, 0xa5, 0x5a, 0xad, 0xa5, 0x5a, 0xb5, 0xad, 0x5a, 0xbd,
- 0xb5, 0x63, 0x63, 0x63, 0x63, 0x6b, 0x6b, 0x63, 0x73, 0x73, 0x63, 0x7b,
- 0x7b, 0x63, 0x84, 0x84, 0x63, 0x8c, 0x8c, 0x63, 0x94, 0x94, 0x63, 0xa5,
- 0x9c, 0x63, 0xa5, 0xa5, 0x63, 0xad, 0xa5, 0x63, 0xb5, 0xad, 0x63, 0xb5,
- 0xb5, 0x63, 0xbd, 0xbd, 0x6b, 0x6b, 0x6b, 0x6b, 0x73, 0x73, 0x6b, 0x7b,
- 0x7b, 0x6b, 0x8c, 0x8c, 0x6b, 0x9c, 0x94, 0x6b, 0xa5, 0x9c, 0x6b, 0xad,
- 0xa5, 0x6b, 0xb5, 0xad, 0x6b, 0xb5, 0xb5, 0x6b, 0xbd, 0xb5, 0x6b, 0xbd,
- 0xbd, 0x6b, 0xc6, 0xbd, 0x6b, 0xc6, 0xc6, 0x6b, 0xce, 0xc6, 0x73, 0x73,
- 0x73, 0x73, 0x7b, 0x7b, 0x73, 0x84, 0x84, 0x73, 0x8c, 0x8c, 0x73, 0x94,
- 0x8c, 0x73, 0x94, 0x94, 0x73, 0x9c, 0x94, 0x73, 0x9c, 0x9c, 0x73, 0xa5,
- 0x9c, 0x73, 0xa5, 0xa5, 0x73, 0xad, 0xad, 0x73, 0xb5, 0xad, 0x73, 0xb5,
- 0xb5, 0x73, 0xbd, 0xbd, 0x73, 0xce, 0xce, 0x7b, 0x7b, 0x7b, 0x7b, 0x8c,
- 0x8c, 0x7b, 0x94, 0x94, 0x7b, 0x9c, 0x9c, 0x7b, 0xa5, 0xa5, 0x7b, 0xb5,
- 0xb5, 0x7b, 0xbd, 0xb5, 0x7b, 0xbd, 0xbd, 0x7b, 0xc6, 0xc6, 0x7b, 0xce,
- 0xc6, 0x7b, 0xce, 0xce, 0x7b, 0xd6, 0xce, 0x7b, 0xd6, 0xd6, 0x7b, 0xde,
- 0xd6, 0x84, 0x84, 0x84, 0x84, 0x8c, 0x8c, 0x84, 0x9c, 0x94, 0x84, 0x9c,
- 0x9c, 0x84, 0xa5, 0x9c, 0x84, 0xad, 0xad, 0x84, 0xb5, 0xb5, 0x84, 0xc6,
- 0xc6, 0x84, 0xce, 0xce, 0x84, 0xd6, 0xd6, 0x8c, 0x7b, 0x7b, 0x8c, 0x84,
- 0x84, 0x8c, 0x8c, 0x8c, 0x8c, 0xa5, 0xa5, 0x8c, 0xad, 0xad, 0x8c, 0xb5,
- 0xb5, 0x8c, 0xbd, 0xb5, 0x8c, 0xbd, 0xbd, 0x8c, 0xc6, 0xc6, 0x8c, 0xce,
- 0xce, 0x8c, 0xde, 0xde, 0x94, 0x7b, 0x7b, 0x94, 0x94, 0x94, 0x94, 0x9c,
- 0x9c, 0x94, 0xa5, 0xa5, 0x94, 0xad, 0xad, 0x94, 0xbd, 0xb5, 0x94, 0xc6,
- 0xbd, 0x9c, 0x9c, 0x9c, 0x9c, 0xa5, 0xa5, 0x9c, 0xb5, 0xb5, 0x9c, 0xbd,
- 0xbd, 0x9c, 0xc6, 0xbd, 0x9c, 0xc6, 0xc6, 0x9c, 0xce, 0xc6, 0x9c, 0xce,
- 0xce, 0x9c, 0xd6, 0xd6, 0xa5, 0x5a, 0x5a, 0xa5, 0x63, 0x63, 0xa5, 0x84,
- 0x84, 0xa5, 0x94, 0x94, 0xa5, 0xa5, 0xa5, 0xa5, 0xad, 0xa5, 0xa5, 0xbd,
- 0xbd, 0xa5, 0xc6, 0xc6, 0xa5, 0xce, 0xce, 0xa5, 0xd6, 0xd6, 0xa5, 0xde,
- 0xde, 0xa5, 0xe7, 0xde, 0xad, 0x21, 0x18, 0xad, 0x21, 0x21, 0xad, 0x52,
- 0x52, 0xad, 0x63, 0x63, 0xad, 0x7b, 0x7b, 0xad, 0xad, 0xad, 0xad, 0xb5,
- 0xb5, 0xad, 0xbd, 0xbd, 0xad, 0xce, 0xc6, 0xad, 0xce, 0xce, 0xad, 0xd6,
- 0xce, 0xad, 0xd6, 0xd6, 0xb5, 0x21, 0x21, 0xb5, 0x52, 0x52, 0xb5, 0x5a,
- 0x5a, 0xb5, 0x63, 0x63, 0xb5, 0x6b, 0x6b, 0xb5, 0xb5, 0xb5, 0xb5, 0xc6,
- 0xc6, 0xb5, 0xce, 0xce, 0xb5, 0xd6, 0xce, 0xb5, 0xd6, 0xd6, 0xb5, 0xde,
- 0xd6, 0xb5, 0xde, 0xde, 0xb5, 0xe7, 0xe7, 0xbd, 0x21, 0x21, 0xbd, 0x29,
- 0x29, 0xbd, 0x42, 0x42, 0xbd, 0x52, 0x52, 0xbd, 0x73, 0x73, 0xbd, 0x7b,
- 0x7b, 0xbd, 0x84, 0x84, 0xbd, 0xbd, 0xbd, 0xbd, 0xc6, 0xc6, 0xbd, 0xce,
- 0xce, 0xbd, 0xd6, 0xd6, 0xbd, 0xde, 0xde, 0xc6, 0x39, 0x39, 0xc6, 0x73,
- 0x73, 0xc6, 0x7b, 0x7b, 0xc6, 0x84, 0x84, 0xc6, 0x8c, 0x8c, 0xc6, 0x94,
- 0x94, 0xc6, 0xc6, 0xc6, 0xc6, 0xce, 0xce, 0xc6, 0xd6, 0xd6, 0xc6, 0xde,
- 0xde, 0xc6, 0xef, 0xe7, 0xce, 0x7b, 0x7b, 0xce, 0x8c, 0x8c, 0xce, 0x94,
- 0x94, 0xce, 0xce, 0xce, 0xce, 0xd6, 0xd6, 0xce, 0xde, 0xde, 0xce, 0xe7,
- 0xe7, 0xd6, 0x84, 0x84, 0xd6, 0x94, 0x8c, 0xd6, 0x94, 0x94, 0xd6, 0x9c,
- 0x9c, 0xd6, 0xad, 0xad, 0xd6, 0xd6, 0xd6, 0xd6, 0xe7, 0xde, 0xd6, 0xef,
- 0xef, 0xde, 0xa5, 0xa5, 0xde, 0xbd, 0xbd, 0xde, 0xce, 0xce, 0xde, 0xde,
- 0xde, 0xde, 0xe7, 0xe7, 0xde, 0xef, 0xe7, 0xde, 0xef, 0xef, 0xe7, 0xbd,
- 0xbd, 0xe7, 0xe7, 0xe7, 0xe7, 0xef, 0xef, 0xe7, 0xf7, 0xf7, 0xef, 0xd6,
- 0xd6, 0xef, 0xef, 0xef, 0xef, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, 0xff,
- 0xf7, 0xf7, 0xff, 0xff, 0xff, 0xf7, 0xf7, 0xff, 0xff, 0xff, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x35, 0x00, 0x00, 0x08,
- 0xfe, 0x00, 0xdd, 0x09, 0x1c, 0x48, 0xb0, 0xa0, 0xba, 0x45, 0x71, 0x76,
- 0xc8, 0x29, 0xc8, 0xb0, 0xa1, 0xc3, 0x87, 0x10, 0x23, 0x4a, 0x9c, 0x48,
- 0xb1, 0xa2, 0x3a, 0x74, 0xe4, 0xb4, 0x05, 0x10, 0x10, 0xa0, 0x48, 0xc5,
- 0x8f, 0x20, 0x43, 0x8a, 0x1c, 0x59, 0x10, 0x5d, 0xb6, 0x5e, 0xae, 0x14,
- 0x08, 0x10, 0xe0, 0x91, 0xa4, 0xcb, 0x97, 0x30, 0x43, 0xaa, 0xfb, 0xd6,
- 0x4b, 0x50, 0x1b, 0x08, 0x1c, 0x8d, 0xc4, 0xdc, 0xc9, 0xb3, 0xe7, 0x40,
- 0x75, 0xd9, 0x2a, 0x3d, 0x09, 0xb2, 0x40, 0xa5, 0x4e, 0x9f, 0x48, 0x93,
- 0xca, 0x84, 0x86, 0xe8, 0x09, 0x8d, 0x05, 0x0b, 0x04, 0x1c, 0x55, 0x4a,
- 0xb5, 0xaa, 0x43, 0x93, 0x88, 0x82, 0xd0, 0xb8, 0xb0, 0x60, 0xc0, 0x54,
- 0xab, 0x60, 0xad, 0x02, 0xcd, 0x4a, 0x43, 0x42, 0xd4, 0x23, 0x61, 0xd3,
- 0x56, 0x55, 0xc7, 0x34, 0x48, 0x8d, 0x0d, 0x10, 0x14, 0x60, 0x51, 0x4b,
- 0x17, 0x29, 0x5b, 0xb2, 0x19, 0x24, 0x14, 0xf8, 0x5a, 0xb7, 0xaf, 0xcb,
- 0xb1, 0x41, 0x4e, 0x60, 0x90, 0xa0, 0x00, 0xad, 0xdf, 0xc3, 0x24, 0xef,
- 0x6a, 0xcd, 0xab, 0x80, 0x2f, 0xe2, 0xc7, 0x13, 0xd1, 0xb5, 0xad, 0x31,
- 0xc2, 0xac, 0x61, 0xc8, 0x98, 0x1d, 0x5e, 0x64, 0xa6, 0xe9, 0x8f, 0x9f,
- 0x38, 0x42, 0x68, 0x90, 0x20, 0x7c, 0x59, 0xa0, 0x3a, 0x75, 0xe0, 0x64,
- 0x39, 0xfa, 0x03, 0xa9, 0x96, 0x39, 0x87, 0xe6, 0x82, 0x31, 0x04, 0x06,
- 0xcc, 0xdd, 0xe9, 0x69, 0xb3, 0x50, 0x35, 0x54, 0x17, 0x2c, 0xd8, 0xeb,
- 0x9f, 0xea, 0xd2, 0x2d, 0xcb, 0xc4, 0xa8, 0x14, 0x30, 0x69, 0xe1, 0xc0,
- 0x81, 0x33, 0xa8, 0x4e, 0x1a, 0x26, 0x39, 0x87, 0x62, 0x95, 0x2b, 0xb8,
- 0xae, 0x9c, 0xb4, 0x5f, 0xda, 0xd4, 0x4d, 0x3b, 0xe5, 0xa7, 0xd1, 0x34,
- 0xcd, 0xe8, 0xc0, 0xfe, 0xbd, 0xda, 0xf2, 0x03, 0xc8, 0x92, 0x25, 0x40,
- 0x62, 0xdc, 0xa8, 0xbc, 0xe0, 0xb2, 0x3a, 0x72, 0xdf, 0x0c, 0xbd, 0x28,
- 0xf1, 0xc3, 0x89, 0x13, 0x26, 0x4d, 0x38, 0xa5, 0x13, 0x88, 0x51, 0x9b,
- 0x26, 0x34, 0x4e, 0x7c, 0xf7, 0x1e, 0x39, 0xd2, 0x2c, 0x50, 0x00, 0x16,
- 0xc9, 0x64, 0xb1, 0x80, 0x04, 0x1b, 0xfc, 0xe6, 0x0e, 0x46, 0x19, 0x95,
- 0xc0, 0xe0, 0x21, 0x0f, 0x96, 0x13, 0x1f, 0x09, 0x25, 0x4c, 0x30, 0xc0,
- 0x4a, 0x01, 0x74, 0x88, 0xc0, 0x7e, 0x17, 0x81, 0xe3, 0x0b, 0x16, 0x12,
- 0x44, 0x10, 0x41, 0x89, 0x0f, 0x30, 0x72, 0x1a, 0x39, 0xe4, 0x44, 0xd3,
- 0x61, 0x00, 0x71, 0x5c, 0x02, 0x01, 0x07, 0x24, 0x28, 0x70, 0x00, 0x85,
- 0x25, 0x7d, 0x03, 0x4d, 0x1c, 0x1b, 0xc8, 0xf0, 0x43, 0x79, 0x33, 0xfc,
- 0x20, 0x03, 0x09, 0x70, 0xb5, 0x67, 0x9b, 0x49, 0xbe, 0xec, 0x30, 0x01,
- 0x09, 0x32, 0xe0, 0x77, 0x46, 0x13, 0x4d, 0x74, 0x51, 0xc7, 0x36, 0x26,
- 0x21, 0x83, 0x49, 0x13, 0xf6, 0x9d, 0x61, 0x21, 0x32, 0xbd, 0xbc, 0xd0,
- 0xd5, 0x02, 0x7a, 0xc4, 0xb1, 0xe0, 0x06, 0x8f, 0x98, 0xf6, 0x0d, 0x32,
- 0xae, 0xf0, 0xc1, 0xc1, 0x06, 0x0b, 0x98, 0x42, 0xce, 0x49, 0x2e, 0x18,
- 0xc0, 0xc1, 0x0c, 0x1c, 0x14, 0xc5, 0x51, 0x87, 0x56, 0xb4, 0x83, 0xce,
- 0x99, 0x70, 0x44, 0xa0, 0x81, 0x06, 0x7e, 0x6a, 0xf0, 0x80, 0x02, 0x04,
- 0x60, 0x71, 0x66, 0x2f, 0x89, 0x00, 0xb0, 0xd1, 0x03, 0x03, 0x48, 0x20,
- 0x43, 0x09, 0x06, 0x0a, 0xb0, 0x0c, 0x41, 0x26, 0xf5, 0xf2, 0x06, 0x04,
- 0x1b, 0x8c, 0x50, 0x82, 0x0c, 0x48, 0xf8, 0x30, 0xe4, 0x06, 0x66, 0xb5,
- 0x77, 0x11, 0x34, 0xa2, 0xe4, 0xc0, 0xa0, 0x0c, 0x3e, 0x70, 0x91, 0x05,
- 0x19, 0x67, 0x38, 0x81, 0x46, 0x17, 0xfe, 0x74, 0x64, 0xe3, 0x8a, 0x20,
- 0x82, 0xf8, 0xe1, 0x04, 0x94, 0x87, 0xf4, 0x82, 0x88, 0x11, 0x05, 0x30,
- 0x50, 0xc0, 0x0e, 0x6c, 0xe0, 0x01, 0x41, 0x03, 0x1b, 0xc4, 0x90, 0xce,
- 0x7b, 0xba, 0xe2, 0x11, 0x03, 0xa8, 0x30, 0x9c, 0x59, 0x89, 0x0e, 0x0b,
- 0xd2, 0x07, 0x43, 0x06, 0x76, 0x06, 0x70, 0x85, 0x36, 0xe5, 0x40, 0xe3,
- 0x8a, 0x1b, 0x10, 0x44, 0x30, 0xc2, 0x08, 0x2c, 0x54, 0x91, 0x50, 0x04,
- 0x0a, 0x04, 0x20, 0x46, 0x25, 0x6c, 0x44, 0xd1, 0xa1, 0x00, 0x0a, 0x2c,
- 0xb0, 0xc1, 0x0c, 0x30, 0xb0, 0xa9, 0x40, 0x1c, 0x03, 0xed, 0xe9, 0x0a,
- 0x1e, 0x17, 0x40, 0xc0, 0xe0, 0x0e, 0x37, 0xd0, 0x40, 0x03, 0x0a, 0x21,
- 0x80, 0x6a, 0x99, 0x64, 0x95, 0x7c, 0xc1, 0xe0, 0x06, 0x24, 0x10, 0xa1,
- 0x55, 0x10, 0x6e, 0xcc, 0xe1, 0x44, 0x1a, 0x6a, 0x68, 0x52, 0x89, 0x17,
- 0x41, 0xb0, 0xe1, 0x47, 0x13, 0x3f, 0x94, 0xf0, 0x46, 0x14, 0x02, 0x8b,
- 0xd0, 0x46, 0x10, 0x4f, 0x5c, 0x21, 0xc1, 0x04, 0x1b, 0xa0, 0x02, 0xd4,
- 0xc4, 0x39, 0xac, 0x29, 0xc1, 0x22, 0x35, 0xe1, 0xa0, 0x2f, 0x07, 0x3f,
- 0xe0, 0x70, 0xc2, 0x09, 0x29, 0xe0, 0x24, 0x40, 0x08, 0x6f, 0x8a, 0xc2,
- 0x46, 0x08, 0x7e, 0xee, 0x30, 0x44, 0x10, 0x41, 0x78, 0x41, 0xc8, 0x05,
- 0xe4, 0x12, 0x10, 0x45, 0x60, 0x2b, 0x25, 0x00, 0x81, 0x05, 0x28, 0x0c,
- 0x91, 0xc5, 0x68, 0x0b, 0xbc, 0x60, 0x1a, 0x39, 0x35, 0xd9, 0xb0, 0xa0,
- 0x04, 0x2d, 0xe0, 0xc1, 0x86, 0x53, 0x1d, 0x74, 0x10, 0x82, 0x04, 0x10,
- 0xb4, 0xf7, 0x8d, 0x2b, 0x6c, 0x7c, 0x50, 0x02, 0x93, 0x57, 0x08, 0xb2,
- 0x35, 0x0d, 0x41, 0xb4, 0x71, 0x46, 0x17, 0x69, 0xd0, 0x31, 0xca, 0x1d,
- 0x40, 0xbf, 0x01, 0xa5, 0x0f, 0x9e, 0x62, 0x28, 0x81, 0xfe, 0x22, 0x78,
- 0x68, 0x15, 0x85, 0x04, 0x19, 0x4c, 0xe0, 0x03, 0x39, 0xc8, 0xf4, 0xfd,
- 0x02, 0xa8, 0x23, 0xf8, 0x32, 0xb1, 0x07, 0x0c, 0x6c, 0x50, 0x42, 0x18,
- 0x5c, 0x9b, 0x90, 0x83, 0x4a, 0x01, 0x5c, 0x42, 0xb6, 0x10, 0x19, 0x8c,
- 0x10, 0x43, 0x1e, 0x78, 0x38, 0x45, 0x44, 0x0f, 0x23, 0x68, 0x00, 0x41,
- 0x11, 0x50, 0x98, 0x40, 0x41, 0x00, 0x08, 0x14, 0x80, 0x41, 0x10, 0x26,
- 0x98, 0xf0, 0x84, 0x0f, 0xa0, 0x2a, 0xa0, 0x8e, 0x6d, 0x41, 0x3d, 0xe1,
- 0xc0, 0x02, 0x79, 0x29, 0x82, 0x12, 0x22, 0x5e, 0xd0, 0xd0, 0x81, 0x07,
- 0x70, 0x0d, 0xb0, 0x03, 0x32, 0x82, 0x04, 0x81, 0x00, 0x91, 0x89, 0xa3,
- 0x29, 0x88, 0x53, 0x41, 0xf4, 0x01, 0xb7, 0x1a, 0xb0, 0x4c, 0xcc, 0x36,
- 0x1c, 0x4c, 0x64, 0xbc, 0xc1, 0x06, 0x1c, 0x18, 0x02, 0x8d, 0xf4, 0x4f,
- 0xe8, 0xc0, 0x01, 0x83, 0xa6, 0x4c, 0x7c, 0x03, 0x09, 0x13, 0x48, 0xd0,
- 0x47, 0x2f, 0x77, 0xd0, 0x80, 0x40, 0x04, 0x24, 0xfc, 0x30, 0x0a, 0xef,
- 0xfe, 0x46, 0xa1, 0x92, 0x00, 0x71, 0x2c, 0x9f, 0x02, 0x93, 0x5b, 0xb8,
- 0x82, 0xc8, 0x17, 0x58, 0x54, 0x2f, 0xc3, 0x16, 0x97, 0x10, 0x85, 0x17,
- 0x4c, 0x87, 0x00, 0x01, 0xec, 0xa5, 0x6f, 0x26, 0x08, 0xc2, 0xd3, 0x30,
- 0x00, 0x81, 0xd9, 0xa1, 0xa3, 0x17, 0x7d, 0x4b, 0x80, 0x02, 0x24, 0xf0,
- 0x82, 0x6f, 0xec, 0x09, 0x19, 0x4d, 0x31, 0xc1, 0x09, 0x44, 0x50, 0x94,
- 0x1d, 0xb8, 0xc2, 0x0b, 0x6f, 0x81, 0x00, 0x04, 0xc6, 0x80, 0x11, 0x9a,
- 0x14, 0x8f, 0x06, 0x60, 0x80, 0x58, 0x1a, 0x68, 0x41, 0x3c, 0xe6, 0x59,
- 0x01, 0x08, 0x32, 0x00, 0xd5, 0x1e, 0x30, 0x02, 0x41, 0x7f, 0x49, 0x01,
- 0x54, 0x13, 0xc8, 0x42, 0xf1, 0x0e, 0x27, 0x81, 0x11, 0x28, 0x43, 0x7a,
- 0xfe, 0x15, 0x90, 0x40, 0xfb, 0xb4, 0x41, 0x3c, 0xad, 0x40, 0x61, 0x7e,
- 0x55, 0x60, 0x43, 0x10, 0x58, 0x10, 0x03, 0x19, 0x2c, 0x42, 0x14, 0x79,
- 0x50, 0xc2, 0x7d, 0x96, 0xc0, 0x07, 0x68, 0x64, 0x43, 0x80, 0x1a, 0x2c,
- 0xe0, 0x02, 0xf6, 0x20, 0x40, 0x7f, 0x61, 0x01, 0x06, 0x60, 0x63, 0x87,
- 0x3b, 0xc6, 0xd6, 0x3b, 0x05, 0xe8, 0x8b, 0x07, 0xb3, 0x7b, 0x0f, 0xd9,
- 0x68, 0x70, 0x82, 0x10, 0x84, 0xad, 0x05, 0x42, 0x41, 0xc1, 0x02, 0x18,
- 0x20, 0x81, 0x32, 0x3d, 0xa8, 0x76, 0x34, 0x88, 0x42, 0x17, 0xd6, 0xa0,
- 0x06, 0x5a, 0x8c, 0x0d, 0x0f, 0xbe, 0xb3, 0xc1, 0xa3, 0x24, 0xa4, 0x8c,
- 0x8b, 0xe0, 0xf1, 0x09, 0x2f, 0x20, 0x01, 0x09, 0x38, 0x10, 0x85, 0x1a,
- 0x70, 0x80, 0x03, 0x25, 0xe8, 0x43, 0xed, 0x4c, 0x80, 0x03, 0x21, 0xce,
- 0x20, 0x18, 0x57, 0x74, 0x0a, 0x0e, 0x0a, 0x50, 0x00, 0x01, 0x80, 0x81,
- 0x62, 0x22, 0x68, 0x52, 0x19, 0xe4, 0x70, 0x2b, 0x27, 0x94, 0xe1, 0x12,
- 0xd9, 0xb0, 0x50, 0x17, 0x6b, 0xa0, 0x12, 0x08, 0x1c, 0xc2, 0x17, 0x80,
- 0xa4, 0x01, 0x16, 0x48, 0x90, 0x81, 0x06, 0x8e, 0x51, 0x14, 0x4e, 0x79,
- 0x00, 0xe0, 0x46, 0xb0, 0x9f, 0x07, 0x15, 0x91, 0x06, 0x1b, 0xa8, 0xa5,
- 0x0b, 0xb2, 0x72, 0x82, 0xca, 0x48, 0x00, 0x09, 0x53, 0x5b, 0x23, 0x15,
- 0xba, 0xc0, 0x4c, 0x66, 0x48, 0x86, 0x98, 0x48, 0x80, 0xe1, 0x06, 0x1a,
- 0xd0, 0x83, 0x63, 0x51, 0x2d, 0x96, 0x37, 0xc4, 0xde, 0x0a, 0x54, 0x80,
- 0xbd, 0x0d, 0x48, 0x03, 0x8f, 0x43, 0x10, 0xe2, 0x0f, 0xcc, 0x10, 0xbd,
- 0x27, 0xdc, 0x20, 0x03, 0x0a, 0x28, 0xc0, 0x02, 0x06, 0xe1, 0x94, 0x22,
- 0xd4, 0x87, 0x0b, 0x50, 0x72, 0xc2, 0x2b, 0xc9, 0x71, 0x1a, 0x32, 0xd2,
- 0xc0, 0x06, 0xe9, 0xfe, 0x5c, 0xc0, 0x22, 0x7e, 0x39, 0x4b, 0xb8, 0xcc,
- 0xee, 0x1b, 0x42, 0xa1, 0x41, 0x0a, 0x32, 0x40, 0xd0, 0x49, 0xb1, 0x43,
- 0x32, 0x82, 0x10, 0x68, 0x06, 0xd8, 0xb4, 0x03, 0xb2, 0xb8, 0x80, 0x41,
- 0x24, 0xd8, 0x86, 0x40, 0xec, 0xb9, 0x05, 0x66, 0xa2, 0xc1, 0x1c, 0xcf,
- 0x7c, 0x82, 0x11, 0x96, 0x10, 0xa4, 0x35, 0x4d, 0x80, 0x0c, 0x0f, 0x62,
- 0x8a, 0x53, 0x9e, 0x30, 0x82, 0x0d, 0x2c, 0x09, 0x7b, 0x13, 0x18, 0xc3,
- 0x4c, 0xd6, 0x18, 0x04, 0x2b, 0x38, 0x6e, 0x06, 0x40, 0x40, 0xc2, 0xe1,
- 0x20, 0x60, 0x00, 0x05, 0x5c, 0x22, 0x2b, 0x94, 0xc4, 0x8f, 0x7d, 0xe6,
- 0xf0, 0x8a, 0x6c, 0xd0, 0xb3, 0x9e, 0x1f, 0xa4, 0x81, 0x10, 0xbe, 0xc4,
- 0x08, 0x68, 0x9c, 0xd0, 0x08, 0x23, 0x10, 0xa1, 0x18, 0xc9, 0xd1, 0x45,
- 0x1b, 0x2c, 0x74, 0x03, 0x3d, 0x28, 0x07, 0xb2, 0xda, 0x60, 0x83, 0x92,
- 0xc2, 0x65, 0x07, 0x01, 0xc5, 0x81, 0x22, 0x65, 0x50, 0x86, 0x72, 0x98,
- 0x44, 0x28, 0x56, 0xc0, 0x92, 0x1a, 0x38, 0xb1, 0x52, 0x3c, 0x50, 0xe1,
- 0x56, 0x4b, 0x38, 0xc2, 0x16, 0x1c, 0xc7, 0x81, 0x4c, 0xb0, 0x83, 0x26,
- 0x6c, 0x60, 0x23, 0x0e, 0x48, 0x36, 0x01, 0x92, 0x6d, 0x60, 0x19, 0xed,
- 0x28, 0x47, 0x0b, 0x69, 0xf0, 0x84, 0x22, 0xf4, 0xe8, 0x51, 0xdf, 0x33,
- 0x4b, 0x29, 0x26, 0x79, 0x82, 0x24, 0x70, 0xe1, 0x0c, 0x65, 0x80, 0xc6,
- 0x37, 0xc8, 0x81, 0x8e, 0xd3, 0xa0, 0x02, 0x13, 0x4d, 0x2d, 0xca, 0x02,
- 0x1a, 0x61, 0x54, 0xad, 0xe8, 0x40, 0x60, 0xb3, 0x23, 0x5c, 0x2c, 0x5d,
- 0x60, 0x55, 0x1f, 0x98, 0xc2, 0x17, 0x89, 0x98, 0x02, 0x06, 0xbe, 0x75,
- 0xbd, 0x23, 0x04, 0x55, 0x08, 0x89, 0x64, 0x92, 0x19, 0x50, 0x71, 0x89,
- 0x37, 0x64, 0x81, 0x09, 0xae, 0x4a, 0xfe, 0xc3, 0x34, 0x08, 0x27, 0x88,
- 0x2f, 0x38, 0x81, 0x99, 0x4b, 0x10, 0x42, 0x1b, 0x62, 0x18, 0x03, 0x0e,
- 0x48, 0xe3, 0x99, 0xac, 0x3b, 0x41, 0x8f, 0x38, 0x30, 0x81, 0x12, 0x24,
- 0xc1, 0x4c, 0x64, 0x5b, 0x18, 0xc2, 0xce, 0x26, 0xb0, 0x01, 0xf0, 0x81,
- 0x8c, 0xad, 0x33, 0x02, 0x96, 0x9a, 0xa0, 0x09, 0x6d, 0x64, 0x23, 0x1a,
- 0xca, 0x80, 0x04, 0x13, 0xb8, 0x30, 0x8a, 0xde, 0x0d, 0x75, 0x00, 0x05,
- 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
+ 0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x6e, 0x00, 0x35, 0x00, 0xe7, 0x00,
+ 0x00, 0xff, 0xff, 0xe2, 0x9f, 0x20, 0x20, 0xb6, 0x25, 0x25, 0xff, 0xff,
+ 0xe0, 0xff, 0xff, 0xdc, 0xdf, 0xdf, 0xc6, 0xff, 0xcc, 0xcc, 0xdf, 0xb2,
+ 0xb2, 0xfe, 0xfc, 0xd3, 0xbf, 0xbf, 0xa9, 0xff, 0xff, 0xe3, 0xf8, 0xe6,
+ 0x93, 0xff, 0xff, 0xdb, 0xdf, 0xdf, 0xc0, 0xf5, 0xdc, 0x76, 0xdf, 0xdf,
+ 0xc4, 0xf8, 0xe6, 0x92, 0xde, 0xdc, 0xb9, 0xee, 0xc3, 0x2c, 0xfc, 0xf4,
+ 0xbd, 0xfc, 0xf4, 0xbc, 0xfd, 0xf8, 0xc9, 0xdf, 0xdf, 0xc5, 0xf3, 0xd6,
+ 0x64, 0xfb, 0xf0, 0xaf, 0xd5, 0xbb, 0x57, 0xf9, 0xeb, 0xa1, 0xf6, 0xe2,
+ 0x86, 0xd9, 0xc9, 0x81, 0xf7, 0xe1, 0x86, 0xbf, 0xbf, 0xa4, 0xff, 0xff,
+ 0xdf, 0xf4, 0xd6, 0x64, 0x3d, 0x36, 0x19, 0xfd, 0xf8, 0xc8, 0xfa, 0xef,
+ 0xaf, 0x20, 0x1f, 0x18, 0xf9, 0xeb, 0xa0, 0xfd, 0xf9, 0xc9, 0xdd, 0xd9,
+ 0xb0, 0xfc, 0xf5, 0xbc, 0xb2, 0x92, 0x21, 0xdc, 0xd5, 0xa4, 0xdf, 0xdf,
+ 0xc7, 0x3f, 0x3c, 0x2c, 0x1f, 0x1c, 0x0f, 0xb8, 0xa5, 0x58, 0xf7, 0xe2,
+ 0x85, 0xf5, 0xdc, 0x75, 0x20, 0x1f, 0x19, 0xff, 0xfe, 0xdb, 0xbf, 0xbf,
+ 0xaa, 0xf7, 0xe1, 0x85, 0xf9, 0xea, 0xa1, 0xd0, 0xab, 0x26, 0xf2, 0xd0,
+ 0x52, 0xff, 0xfc, 0xd3, 0xda, 0xce, 0x8d, 0x40, 0x3f, 0x35, 0xdc, 0xd5,
+ 0xa5, 0xf7, 0xe2, 0x86, 0xfa, 0xf0, 0xaf, 0x3e, 0x3b, 0x28, 0x40, 0x40,
+ 0x39, 0x40, 0x40, 0x37, 0xdb, 0xd2, 0x99, 0xbb, 0xb0, 0x78, 0xfb, 0xef,
+ 0xaf, 0xd6, 0xc0, 0x67, 0xfa, 0xeb, 0xa1, 0xdd, 0xda, 0xb0, 0xf6, 0xe1,
+ 0x86, 0x04, 0x04, 0x03, 0xfe, 0xfc, 0xd4, 0x5c, 0x51, 0x26, 0xba, 0xac,
+ 0x6e, 0xdf, 0xdf, 0xc3, 0xef, 0xc6, 0x34, 0xf0, 0xca, 0x42, 0xb9, 0xa9,
+ 0x64, 0xff, 0xfe, 0xdc, 0x1e, 0x1b, 0x0d, 0x1f, 0x1c, 0x11, 0x1f, 0x1d,
+ 0x14, 0xf5, 0xdd, 0x76, 0x5b, 0x51, 0x26, 0xdd, 0xda, 0xaf, 0xf9, 0xea,
+ 0xa0, 0x3f, 0x3d, 0x2f, 0xb5, 0x9c, 0x3d, 0xd6, 0xc1, 0x67, 0xdc, 0xd2,
+ 0x99, 0xfa, 0xeb, 0xa0, 0xd5, 0xbc, 0x57, 0xd9, 0xc9, 0x80, 0x3f, 0x3e,
+ 0x32, 0x3e, 0x3a, 0x25, 0xfe, 0xf8, 0xc8, 0xda, 0xce, 0x8c, 0x20, 0x20,
+ 0x1c, 0xf7, 0xe6, 0x93, 0xd7, 0xc6, 0x75, 0x3d, 0x37, 0x1e, 0xfb, 0xef,
+ 0xae, 0xfd, 0xf9, 0xc8, 0xbe, 0xbd, 0x9e, 0xbb, 0xb4, 0x83, 0xd7, 0xc5,
+ 0x75, 0x1f, 0x1d, 0x12, 0xdc, 0xd1, 0x98, 0x20, 0x20, 0x1b, 0x1f, 0x1e,
+ 0x16, 0x1f, 0x1b, 0x0d, 0xbf, 0xbf, 0xa5, 0x40, 0x40, 0x38, 0xdf, 0xdc,
+ 0xb9, 0xfc, 0xf5, 0xbd, 0xf4, 0xd6, 0x65, 0xfa, 0xea, 0xa1, 0xd8, 0xc9,
+ 0x81, 0xf0, 0xcb, 0x42, 0xdf, 0xde, 0xc0, 0x1e, 0x18, 0x06, 0xf6, 0xdc,
+ 0x75, 0xbf, 0xbf, 0xa8, 0xd8, 0xc6, 0x75, 0xd6, 0xc0, 0x66, 0xf7, 0xe6,
+ 0x92, 0xf1, 0xca, 0x42, 0xd2, 0xb2, 0x3a, 0xbe, 0xbe, 0x9e, 0x43, 0x40,
+ 0x2f, 0xd7, 0xc6, 0x74, 0xb8, 0xa6, 0x58, 0xbc, 0xb4, 0x83, 0xda, 0xcd,
+ 0x8d, 0xf4, 0xd7, 0x64, 0xbb, 0xb0, 0x79, 0xfe, 0xf9, 0xc9, 0x5e, 0x5a,
+ 0x42, 0xfa, 0xea, 0xa0, 0x60, 0x60, 0x55, 0x71, 0x17, 0x17, 0xbc, 0xb4,
+ 0x82, 0x88, 0x1c, 0x1c, 0xba, 0xac, 0x6d, 0xbd, 0xb7, 0x8e, 0xef, 0xc5,
+ 0x34, 0xd8, 0xc5, 0x75, 0xff, 0xff, 0xdd, 0xfb, 0xf0, 0xae, 0x44, 0x44,
+ 0x3a, 0xff, 0xff, 0xe1, 0xde, 0xdf, 0xc0, 0x10, 0x10, 0x0d, 0xf3, 0xd7,
+ 0x64, 0xd1, 0xad, 0x2d, 0xbd, 0xb8, 0x8d, 0xdf, 0xdf, 0xc2, 0xbf, 0x99,
+ 0x99, 0x3e, 0x39, 0x22, 0x5f, 0x5c, 0x47, 0xef, 0xc6, 0x35, 0xf6, 0xdc,
+ 0x76, 0xff, 0xff, 0xde, 0x61, 0x61, 0x54, 0x60, 0x60, 0x54, 0xfb, 0xf4,
+ 0xbc, 0x3e, 0x38, 0x22, 0x3f, 0x3b, 0x28, 0x20, 0x20, 0x1a, 0xdc, 0xd6,
+ 0xa4, 0x5f, 0x5e, 0x4c, 0xbb, 0xb3, 0x82, 0x5e, 0x58, 0x3c, 0x10, 0x0f,
+ 0x0b, 0xde, 0xd9, 0xb0, 0xe3, 0xd9, 0x9f, 0xd2, 0xb1, 0x3a, 0xbb, 0xb4,
+ 0x82, 0xcd, 0xc6, 0x99, 0xa0, 0x90, 0x4d, 0xe5, 0xe2, 0xb6, 0xb8, 0xa9,
+ 0x64, 0xdf, 0xdf, 0xc1, 0xda, 0xcd, 0x8c, 0xfa, 0xf0, 0xae, 0x08, 0x07,
+ 0x05, 0xfe, 0xf8, 0xc9, 0xfa, 0xef, 0xae, 0xbf, 0xbe, 0xa5, 0x62, 0x5c,
+ 0x3f, 0xf1, 0xd0, 0x52, 0x5e, 0x58, 0x3d, 0xbe, 0xba, 0x97, 0x8f, 0x8f,
+ 0x7f, 0x60, 0x5f, 0x50, 0x28, 0x26, 0x1d, 0xb9, 0xac, 0x6e, 0x71, 0x63,
+ 0x2e, 0xdb, 0xcd, 0x8d, 0xd8, 0xc5, 0x74, 0xfe, 0xfd, 0xd4, 0x98, 0x8f,
+ 0x63, 0x60, 0x5e, 0x4c, 0xc2, 0xb7, 0x7e, 0xf6, 0xe1, 0x85, 0xf6, 0xe2,
+ 0x85, 0x0f, 0x0d, 0x06, 0x42, 0x3e, 0x2b, 0xbe, 0xbb, 0x97, 0xdc, 0xd1,
+ 0x99, 0x3d, 0x34, 0x15, 0xbd, 0xb7, 0x8d, 0x98, 0x86, 0x3e, 0x99, 0x89,
+ 0x4a, 0xee, 0xc5, 0x34, 0x27, 0x25, 0x19, 0xe1, 0xd0, 0x84, 0x60, 0x60,
+ 0x52, 0x3e, 0x39, 0x21, 0x3e, 0x38, 0x21, 0x60, 0x5f, 0x4f, 0x44, 0x44,
+ 0x3b, 0xee, 0xc6, 0x35, 0x1e, 0x1a, 0x0a, 0xf6, 0xdd, 0x76, 0xdb, 0xd2,
+ 0x98, 0xb5, 0x9c, 0x3e, 0xdc, 0xd2, 0x98, 0x85, 0x6d, 0x19, 0x18, 0x17,
+ 0x10, 0xd0, 0xad, 0x2e, 0x93, 0x7c, 0x28, 0xee, 0xc6, 0x34, 0x3c, 0x34,
+ 0x15, 0xdd, 0xd9, 0xaf, 0xe3, 0xe3, 0xc7, 0x1f, 0x1f, 0x18, 0xbf, 0xbe,
+ 0xa4, 0xbf, 0xbd, 0x9e, 0x44, 0x43, 0x38, 0x30, 0x30, 0x29, 0xef, 0xc5,
+ 0x35, 0x48, 0x47, 0x3c, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0x21, 0xf9, 0x04, 0x01, 0x00, 0x00, 0xff, 0x00, 0x2c, 0x00, 0x00,
+ 0x00, 0x00, 0x6e, 0x00, 0x35, 0x00, 0x00, 0x08, 0xfe, 0x00, 0xff, 0x09,
+ 0x1c, 0x48, 0xb0, 0xa0, 0xc1, 0x83, 0x08, 0x13, 0x2a, 0x5c, 0xc8, 0xb0,
+ 0xa1, 0xc3, 0x87, 0x10, 0x23, 0x4a, 0x9c, 0x48, 0xb1, 0xa2, 0xc5, 0x8b,
+ 0x18, 0x33, 0x56, 0xac, 0xc7, 0xb1, 0x63, 0x3d, 0x8d, 0x20, 0x43, 0x5a,
+ 0xac, 0x17, 0xa7, 0x81, 0xc9, 0x38, 0x1f, 0x45, 0xaa, 0x5c, 0xc9, 0xb0,
+ 0x5e, 0x03, 0x02, 0x30, 0x1b, 0xa4, 0x64, 0x49, 0xb3, 0xa6, 0x40, 0x97,
+ 0x30, 0x09, 0xc8, 0xb4, 0xc9, 0x93, 0x25, 0xce, 0x98, 0x33, 0x7b, 0x0a,
+ 0xcd, 0xf8, 0x53, 0x67, 0xd0, 0xa1, 0x48, 0x29, 0x16, 0xdd, 0x99, 0xb4,
+ 0xe9, 0xc4, 0xa5, 0x47, 0x9d, 0x4a, 0x5d, 0x08, 0x75, 0xaa, 0xd5, 0x96,
+ 0x0d, 0x2a, 0xc1, 0xc4, 0x15, 0xf5, 0xaa, 0xd7, 0x9b, 0x9e, 0x3e, 0x7c,
+ 0x20, 0xe5, 0xa9, 0xeb, 0xd7, 0xa4, 0x1e, 0x3b, 0x3e, 0x18, 0xc0, 0xf6,
+ 0x41, 0xca, 0xb4, 0x1e, 0x07, 0xc6, 0xbd, 0xd9, 0xf1, 0xdf, 0x5c, 0x82,
+ 0x77, 0xe1, 0xde, 0xb5, 0xab, 0x97, 0xae, 0x5e, 0x8e, 0x11, 0x39, 0x26,
+ 0x28, 0x60, 0xa1, 0x00, 0xe1, 0x02, 0x98, 0x00, 0x28, 0x2e, 0xf0, 0xb1,
+ 0xde, 0xe0, 0xc2, 0x86, 0x0b, 0xac, 0x98, 0xd1, 0x38, 0x81, 0x05, 0x0b,
+ 0x09, 0x2a, 0x17, 0x48, 0xd0, 0xa8, 0x5e, 0xa3, 0xc1, 0x99, 0xf1, 0x5a,
+ 0xde, 0xdc, 0x71, 0xb0, 0xe1, 0xc2, 0x90, 0x43, 0x0b, 0x3e, 0x7d, 0x3a,
+ 0xb3, 0xe3, 0xcb, 0x90, 0x51, 0x93, 0x7e, 0xe8, 0xb8, 0x80, 0x02, 0xc5,
+ 0xb8, 0x6f, 0x2b, 0x56, 0xb0, 0xa2, 0xde, 0x8f, 0x04, 0xb7, 0x83, 0xe3,
+ 0x9e, 0xfc, 0x63, 0x06, 0x80, 0xdb, 0x05, 0x7e, 0x8c, 0xf9, 0x51, 0xe0,
+ 0x78, 0xef, 0xc1, 0x00, 0x18, 0xcb, 0x35, 0xae, 0x80, 0xf7, 0xef, 0x15,
+ 0xbb, 0x75, 0x57, 0xe7, 0xcd, 0x71, 0x46, 0xf3, 0xe3, 0xda, 0x15, 0xfe,
+ 0x50, 0xc6, 0xae, 0x3b, 0x7b, 0xf5, 0xd0, 0x0d, 0xeb, 0x7d, 0xc7, 0xbd,
+ 0x9b, 0x3d, 0xe3, 0x04, 0xec, 0xe3, 0x2b, 0xce, 0xcc, 0x9e, 0xf3, 0x7a,
+ 0xc6, 0xd8, 0xe7, 0x37, 0x1e, 0x96, 0x1f, 0xc0, 0x0c, 0xe6, 0xf2, 0xd5,
+ 0xe7, 0x58, 0x79, 0x86, 0xb9, 0xa7, 0x5e, 0x80, 0x02, 0xb6, 0xc4, 0x07,
+ 0x5b, 0x03, 0x7c, 0x30, 0xc0, 0x03, 0x10, 0x36, 0xc8, 0xd6, 0x07, 0x6e,
+ 0x31, 0xc1, 0xe0, 0x00, 0x4c, 0x44, 0x28, 0x21, 0x13, 0xf5, 0x2c, 0xc8,
+ 0xe0, 0x5a, 0x6c, 0x31, 0x61, 0x4a, 0x3d, 0x33, 0x30, 0xc8, 0xa1, 0x5d,
+ 0x6b, 0x89, 0xf5, 0x80, 0x1c, 0x72, 0x80, 0xf8, 0x60, 0x3b, 0x29, 0x3e,
+ 0xc8, 0x91, 0x8b, 0x7c, 0xd4, 0x63, 0x0a, 0x88, 0x14, 0xd6, 0xe3, 0x62,
+ 0x88, 0x0c, 0x3a, 0xe8, 0x56, 0x4b, 0x79, 0x10, 0xc0, 0x80, 0x0c, 0x0c,
+ 0x78, 0x00, 0x84, 0x1b, 0x97, 0x78, 0xc0, 0xc0, 0x92, 0x0c, 0xc8, 0x04,
+ 0x13, 0x14, 0x45, 0x1e, 0x09, 0x84, 0x92, 0x50, 0xc8, 0x40, 0x80, 0x91,
+ 0x0d, 0x10, 0xc9, 0x24, 0x01, 0x32, 0x78, 0x30, 0x46, 0x3d, 0x72, 0xbc,
+ 0xb4, 0xe4, 0x3b, 0xf5, 0x78, 0x20, 0x83, 0x95, 0x04, 0xf8, 0x02, 0x44,
+ 0x1c, 0x0c, 0x10, 0x00, 0x85, 0x07, 0x97, 0xc8, 0xf3, 0x4d, 0x26, 0x42,
+ 0xca, 0x64, 0x26, 0x50, 0x65, 0x42, 0x21, 0x24, 0x03, 0x79, 0xd4, 0x93,
+ 0xc9, 0x92, 0x50, 0x7a, 0xb0, 0x4d, 0x03, 0x4c, 0x36, 0x69, 0x96, 0x5c,
+ 0x69, 0x20, 0xa0, 0x28, 0x02, 0x11, 0xe8, 0x50, 0x0f, 0x12, 0x9a, 0xc4,
+ 0x13, 0x01, 0x0e, 0x8a, 0x46, 0x50, 0x0f, 0x02, 0x49, 0x30, 0xea, 0x28,
+ 0x47, 0x3a, 0x44, 0xb0, 0xe8, 0x1c, 0xf5, 0x08, 0xa2, 0x28, 0xa5, 0x8a,
+ 0xa6, 0xb1, 0x69, 0x3d, 0x69, 0x64, 0xca, 0xa8, 0x37, 0x93, 0x2a, 0xa3,
+ 0xa9, 0x2a, 0xfe, 0x9e, 0x32, 0x4a, 0xcf, 0xa3, 0x6e, 0x48, 0x82, 0x03,
+ 0x0e, 0x96, 0x7a, 0x4a, 0x69, 0x04, 0xc4, 0x88, 0x8a, 0x29, 0xa3, 0xf0,
+ 0xd4, 0x13, 0x41, 0x12, 0x99, 0xce, 0xa1, 0x83, 0x2a, 0x73, 0x20, 0x40,
+ 0xaa, 0xa5, 0x54, 0x59, 0x51, 0x81, 0x08, 0x15, 0x98, 0x70, 0x42, 0x0c,
+ 0x1c, 0x21, 0x11, 0xc3, 0x09, 0xd1, 0x8a, 0x70, 0x42, 0x3d, 0xd0, 0x86,
+ 0x31, 0x6d, 0x47, 0x31, 0x58, 0xc1, 0x8b, 0x08, 0x22, 0xb0, 0x53, 0xcf,
+ 0x17, 0x27, 0x40, 0xab, 0x48, 0x05, 0xb0, 0x30, 0xe3, 0x11, 0xba, 0xd9,
+ 0x1a, 0x01, 0xad, 0x09, 0x68, 0x48, 0xc3, 0x91, 0xbc, 0x15, 0xd8, 0xc2,
+ 0x8a, 0x26, 0xf5, 0xc4, 0x20, 0x09, 0xb4, 0x96, 0x1a, 0x41, 0x6f, 0x05,
+ 0x15, 0x60, 0x6b, 0x82, 0x09, 0x61, 0x08, 0xf3, 0x05, 0x47, 0x06, 0xa3,
+ 0x61, 0x45, 0x0c, 0xd7, 0x22, 0x0c, 0xad, 0x11, 0x87, 0xde, 0x64, 0x05,
+ 0x0a, 0x28, 0x4c, 0x30, 0x81, 0x0a, 0x24, 0x74, 0xe4, 0xce, 0x0e, 0x13,
+ 0x50, 0x40, 0xc1, 0x0e, 0xf5, 0x50, 0xa0, 0xf1, 0x0e, 0x24, 0x20, 0xf1,
+ 0x28, 0x09, 0x2a, 0x88, 0x4c, 0xc1, 0x2a, 0xf5, 0x60, 0xb1, 0x83, 0xc9,
+ 0x28, 0xd0, 0x41, 0x81, 0x24, 0x1d, 0x73, 0x44, 0x82, 0x24, 0xa7, 0x4c,
+ 0x90, 0x31, 0xcd, 0xab, 0x60, 0xc1, 0x51, 0x27, 0x3e, 0x53, 0x40, 0x4b,
+ 0x28, 0xc5, 0xc8, 0x6c, 0x32, 0xc5, 0x2a, 0x64, 0x5c, 0xb3, 0xc9, 0x23,
+ 0x57, 0x13, 0x4a, 0xce, 0x2a, 0x84, 0x4c, 0x01, 0xc7, 0x2c, 0x53, 0x40,
+ 0x87, 0xc6, 0x2a, 0x54, 0x6c, 0x57, 0x27, 0x18, 0x60, 0xd0, 0x43, 0x0f,
+ 0x41, 0xb0, 0xd0, 0x11, 0x0b, 0x5b, 0x0c, 0xd1, 0x03, 0x06, 0x41, 0xd4,
+ 0x83, 0xc1, 0x08, 0x23, 0x6c, 0x31, 0xc8, 0x39, 0xbb, 0xbc, 0x32, 0xc8,
+ 0x16, 0x23, 0x0c, 0x81, 0xc1, 0xfe, 0x2c, 0x2c, 0xb4, 0x02, 0xb7, 0xde,
+ 0x67, 0xb0, 0x6d, 0xf6, 0xd9, 0xe5, 0x58, 0x82, 0x81, 0x25, 0x79, 0x63,
+ 0x60, 0xc8, 0xd9, 0x6a, 0x88, 0x3d, 0x42, 0x2c, 0x41, 0xb4, 0x01, 0x78,
+ 0xd7, 0x8f, 0x84, 0xad, 0x37, 0xdb, 0x86, 0x2c, 0xb2, 0x88, 0x1a, 0x6a,
+ 0x98, 0x3d, 0x4d, 0x2f, 0x23, 0xf4, 0x30, 0xce, 0x1b, 0x6f, 0xb4, 0xa1,
+ 0x4b, 0x0f, 0x67, 0x9c, 0xb1, 0x85, 0xd7, 0x76, 0x89, 0xc1, 0x48, 0x09,
+ 0x25, 0xd4, 0x20, 0x44, 0x2a, 0x53, 0xf8, 0x20, 0x84, 0x06, 0x57, 0x94,
+ 0x70, 0x45, 0x0e, 0xf5, 0x20, 0x53, 0x43, 0x0d, 0x1a, 0x34, 0xf3, 0x4b,
+ 0x36, 0xd1, 0x08, 0x51, 0x02, 0x17, 0x76, 0x20, 0x93, 0xca, 0xed, 0x45,
+ 0x70, 0x51, 0x82, 0x1d, 0x76, 0xe0, 0x2e, 0x84, 0x0f, 0x1d, 0x4d, 0x91,
+ 0x08, 0xf0, 0x5c, 0xd4, 0xb0, 0x7b, 0x5a, 0x3e, 0xe4, 0x50, 0x82, 0x06,
+ 0x25, 0x14, 0x21, 0xbe, 0x06, 0x1a, 0xac, 0xde, 0xbd, 0x06, 0x45, 0xd4,
+ 0x70, 0x88, 0x2b, 0xc1, 0x24, 0x92, 0x0b, 0xfa, 0x42, 0xd4, 0x93, 0xc3,
+ 0xeb, 0x1a, 0x1c, 0x32, 0xc5, 0x14, 0x62, 0x1c, 0x0f, 0x3c, 0xef, 0x2d,
+ 0x45, 0x02, 0xc1, 0x02, 0x0b, 0x20, 0xc3, 0x02, 0x38, 0xc0, 0x01, 0x2f,
+ 0x08, 0x10, 0x02, 0xff, 0xbb, 0x43, 0x3d, 0x96, 0x00, 0xc0, 0x05, 0xfc,
+ 0x41, 0x1b, 0x5e, 0xf0, 0x02, 0x02, 0xff, 0xb7, 0x04, 0x30, 0x20, 0xf0,
+ 0x0f, 0x03, 0xe4, 0x00, 0x00, 0x31, 0x58, 0xc1, 0x8e, 0x80, 0xc1, 0x0b,
+ 0x0b, 0xf8, 0x1f, 0x04, 0x96, 0x00, 0x97, 0x48, 0xdc, 0x21, 0x84, 0x22,
+ 0x04, 0x20, 0xef, 0xd8, 0xc0, 0x40, 0x11, 0xde, 0x41, 0x83, 0x64, 0x40,
+ 0x20, 0x07, 0xea, 0xa1, 0xc1, 0xff, 0x71, 0x80, 0x0d, 0x6c, 0xd0, 0x60,
+ 0x03, 0x67, 0x98, 0x9e, 0x27, 0x6c, 0x80, 0x07, 0xfe, 0x1b, 0x78, 0x01,
+ 0x0f, 0x3a, 0xc0, 0x03, 0x67, 0x74, 0xe0, 0x87, 0x34, 0x48, 0x46, 0x3d,
+ 0xaa, 0x70, 0x84, 0x23, 0xd2, 0xa0, 0x03, 0x47, 0x38, 0x82, 0x03, 0xa6,
+ 0xe8, 0x87, 0x2a, 0xf4, 0xe1, 0x89, 0x2f, 0x58, 0x03, 0x37, 0xba, 0x51,
+ 0x86, 0x17, 0xbc, 0xe0, 0x08, 0x1b, 0x78, 0x42, 0x3d, 0xa4, 0x30, 0xc6,
+ 0x35, 0x08, 0x91, 0x07, 0x6b, 0xf8, 0x0b, 0x2a, 0x9e, 0xd0, 0x07, 0x4a,
+ 0x3c, 0x31, 0x88, 0x33, 0xe4, 0xc8, 0x13, 0x9c, 0xd8, 0x01, 0x1a, 0xfc,
+ 0x30, 0x88, 0x65, 0xa8, 0x47, 0x1f, 0x8e, 0xf8, 0x0c, 0x42, 0x48, 0x41,
+ 0x0a, 0x84, 0x78, 0xc1, 0x06, 0x3a, 0xf0, 0x82, 0x3c, 0x3a, 0xa4, 0x1e,
+ 0x85, 0x70, 0x00, 0x0c, 0xa6, 0x28, 0x0e, 0x07, 0x8c, 0x62, 0x8a, 0x0e,
+ 0x20, 0x82, 0x0b, 0xea, 0x61, 0x06, 0x17, 0x68, 0x41, 0x91, 0x90, 0x9c,
+ 0xa2, 0x16, 0xaa, 0x00, 0x0d, 0x22, 0x60, 0xd2, 0x05, 0x2d, 0x68, 0x81,
+ 0x0b, 0xa6, 0x08, 0x03, 0x2d, 0xa4, 0xa3, 0x1e, 0x2d, 0x40, 0xa5, 0x27,
+ 0x61, 0x40, 0x85, 0x49, 0xfe, 0x85, 0x23, 0x95, 0x74, 0x00, 0x15, 0x1c,
+ 0xe0, 0x07, 0x8f, 0x14, 0xc2, 0x0f, 0x7b, 0xa0, 0xc2, 0x23, 0x1d, 0xb0,
+ 0x07, 0x49, 0xd6, 0x83, 0x08, 0x7b, 0x50, 0xa4, 0x16, 0x42, 0x79, 0x49,
+ 0x2a, 0x2c, 0x92, 0x08, 0xac, 0xbb, 0x89, 0x12, 0x52, 0x90, 0x01, 0x10,
+ 0x5c, 0x00, 0x11, 0xce, 0x04, 0x41, 0x06, 0x52, 0xa0, 0x84, 0x10, 0xc0,
+ 0x21, 0x0a, 0x21, 0xa8, 0x42, 0x17, 0x2e, 0xc0, 0xcd, 0x0b, 0x6c, 0x22,
+ 0x03, 0x55, 0x88, 0x02, 0x1c, 0x94, 0xd0, 0x05, 0x69, 0x2a, 0x21, 0x0a,
+ 0x51, 0xd0, 0xa6, 0x34, 0xd3, 0x11, 0x82, 0x7a, 0xc0, 0xa1, 0x1e, 0x21,
+ 0xc8, 0x40, 0x1d, 0x10, 0x91, 0x01, 0xbd, 0x84, 0xc0, 0x1a, 0xed, 0xfe,
+ 0xe4, 0x88, 0x12, 0x32, 0xc0, 0x4d, 0x22, 0x1c, 0xa3, 0x23, 0xd9, 0xec,
+ 0x42, 0x1d, 0xb8, 0x29, 0xcd, 0x8e, 0xf0, 0xd3, 0x9b, 0x19, 0x08, 0x41,
+ 0x3c, 0x2f, 0x50, 0x07, 0x67, 0xd6, 0xb3, 0x25, 0xf5, 0xf8, 0x84, 0x01,
+ 0x26, 0x4a, 0xd1, 0x8a, 0x1a, 0xe0, 0x00, 0x18, 0xcd, 0xa8, 0x45, 0x33,
+ 0xca, 0x51, 0x8a, 0x76, 0x74, 0xa2, 0x18, 0xfd, 0x44, 0x3d, 0xb2, 0x00,
+ 0x8c, 0x1b, 0xdc, 0x80, 0x1c, 0xf5, 0xc0, 0xe8, 0x45, 0x0f, 0x30, 0xd2,
+ 0x1b, 0x64, 0x61, 0x1d, 0xe1, 0xa0, 0x46, 0x16, 0x4c, 0x7a, 0x83, 0x7a,
+ 0x72, 0xf4, 0x00, 0x16, 0x5d, 0x29, 0x4e, 0x2b, 0xaa, 0x52, 0x9e, 0x7a,
+ 0xad, 0x1e, 0x8e, 0x08, 0x80, 0x00, 0x86, 0x4a, 0xd4, 0xa2, 0x1a, 0xf5,
+ 0xa8, 0x48, 0x4d, 0xea, 0x51, 0x03, 0x50, 0x8f, 0x40, 0xe0, 0x01, 0x0f,
+ 0x4e, 0xa8, 0x87, 0x51, 0x99, 0xea, 0x04, 0x40, 0x38, 0x21, 0x10, 0xb2,
+ 0x08, 0x84, 0x13, 0xa0, 0x0a, 0x88, 0x7a, 0x2a, 0xf5, 0xab, 0x4b, 0x85,
+ 0x04, 0x60, 0x12, 0xc2, 0x11, 0x48, 0x04, 0xe0, 0xac, 0x68, 0x4d, 0xab,
+ 0x5a, 0xd7, 0xca, 0xd6, 0xb6, 0xae, 0xb5, 0x1e, 0x9c, 0x10, 0x05, 0x36,
+ 0x26, 0x81, 0x8e, 0x7a, 0xbc, 0xb5, 0x09, 0xa2, 0x98, 0x47, 0x13, 0xf6,
+ 0x0a, 0x0e, 0x75, 0x4c, 0xa2, 0x09, 0x9c, 0xb0, 0xab, 0x5b, 0x07, 0xcb,
+ 0x56, 0x47, 0xfc, 0xf4, 0x95, 0x88, 0x4d, 0xac, 0x62, 0x39, 0x62, 0x03,
+ 0x09, 0x38, 0xd6, 0x1c, 0x7f, 0x49, 0x81, 0x63, 0x27, 0x3b, 0xd9, 0x14,
+ 0x2c, 0xf6, 0xb2, 0x7b, 0x39, 0x8b, 0x5d, 0x24, 0x2b, 0x01, 0x1b, 0x98,
+ 0xa5, 0x1e, 0x29, 0x68, 0xec, 0x64, 0x6d, 0x60, 0x59, 0xcd, 0xf2, 0x04,
+ 0xb4, 0xa4, 0x3d, 0x14, 0x47, 0x42, 0x9b, 0xda, 0x64, 0x9a, 0x16, 0x23,
+ 0x7a, 0x88, 0x2d, 0x2d, 0x44, 0xc7, 0xfa, 0xda, 0xda, 0xda, 0xf6, 0xb6,
+ 0xb8, 0xcd, 0xad, 0x6e, 0x77, 0xcb, 0xdb, 0xde, 0xfa, 0xf6, 0xb7, 0xc0,
+ 0x0d, 0xae, 0x70, 0x87, 0x4b, 0xdc, 0xe2, 0x1a, 0xf7, 0xb8, 0xc8, 0x4d,
+ 0xae, 0x72, 0x97, 0xcb, 0xdc, 0xe6, 0x3a, 0xf7, 0xb9, 0x53, 0x09, 0x08,
+ 0x00, 0x3b
};
-const unsigned int logo_len = 3536;
+const unsigned int logo_len = 2378;
unsigned char search_data[] = {
0x47, 0x49, 0x46, 0x38, 0x39, 0x61, 0x78, 0x00, 0x1a, 0x00, 0xe7, 0x00,
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index dab56ea..30f371f 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -225,12 +225,13 @@ static void writeTemplatePrefix(OutputList &ol,ArgumentList *al,bool br=TRUE)
* 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,
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;
fileDef=0;
fileDec=0;
@@ -251,7 +252,6 @@ MemberDef::MemberDef(const char *t,const char *na,const char *a,const char *e,
args=substituteClassNames(a);
if (type.isNull()) decl=name()+args; else decl=type+" "+name()+args;
declLine=0;
- defLine=0;
memberGroup=0;
virt=v;
prot=p;
@@ -395,8 +395,10 @@ QCString MemberDef::getOutputFileBase() const
{
return nspace->getOutputFileBase();
}
- warn("Warning: Internal inconsistency: member %s does not belong to any\n"
- " container!\n",name().data());
+ warn(defFileName,defLine,
+ "Warning: Internal inconsistency: member %s does not belong to any"
+ " container!",name().data()
+ );
return "dummy";
}
@@ -773,7 +775,7 @@ void MemberDef::writeDeclaration(OutputList &ol,
if (!briefDescription().isEmpty() && Config::briefMemDescFlag && !annMemb)
{
ol.startMemberDescription();
- parseDoc(ol,cname,name(),briefDescription());
+ parseDoc(ol,defFileName,defLine,cname,name(),briefDescription());
if (/*!documentation().isEmpty()*/ detailsAreVisible())
{
ol.disableAllBut(OutputGenerator::Html);
@@ -1044,14 +1046,14 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
) /* || !annMemb */
)
{
- parseDoc(ol,scopeName,name(),briefDescription());
+ parseDoc(ol,defFileName,defLine,scopeName,name(),briefDescription());
ol.newParagraph();
}
/* write detailed description */
if (!documentation().isEmpty())
{
- parseDoc(ol,scopeName,name(),documentation()+"\n");
+ parseDoc(ol,defFileName,defLine,scopeName,name(),documentation()+"\n");
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::RTF);
ol.newParagraph();
@@ -1083,7 +1085,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
ol.endEmphasis();
ol.endDescTableTitle();
ol.startDescTableData();
- parseDoc(ol,scopeName,name(),a->docs);
+ parseDoc(ol,defFileName,defLine,scopeName,name(),a->docs);
ol.endDescTableData();
}
}
@@ -1138,7 +1140,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if (!fmd->briefDescription().isEmpty())
{
- parseDoc(ol,scopeName,fmd->name(),fmd->briefDescription());
+ parseDoc(ol,defFileName,defLine,scopeName,fmd->name(),fmd->briefDescription());
//ol.newParagraph();
}
if (!fmd->briefDescription().isEmpty() &&
@@ -1148,7 +1150,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
}
if (!fmd->documentation().isEmpty())
{
- parseDoc(ol,scopeName,fmd->name(),fmd->documentation()+"\n");
+ parseDoc(ol,defFileName,defLine,scopeName,fmd->name(),fmd->documentation()+"\n");
}
ol.endDescTableData();
}
@@ -1329,7 +1331,7 @@ void MemberDef::warnIfUndocumented()
t="group", d=gd;
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());
}
diff --git a/src/memberdef.h b/src/memberdef.h
index 90f0f75..f369592 100644
--- a/src/memberdef.h
+++ b/src/memberdef.h
@@ -59,7 +59,8 @@ class MemberDef : public Definition
// 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,
bool related,MemberType t,const ArgumentList *tal,
const ArgumentList *al);
@@ -96,8 +97,8 @@ class MemberDef : public Definition
MemberList *getSectionList() const { return section; }
void setMemberType(MemberType t) { mtype=t; }
void setDefinition(const char *d) { def=d; }
- void setDefFile(const char *f) { defFile=f; }
- void setDefLine(int l) { defLine=l; }
+ //void setDefFile(const char *f) { defFile=f; }
+ //void setDefLine(int l) { defLine=l; }
void setFileDef(FileDef *fd) { fileDef=fd; }
void setFileDec(FileDef *fd) { fileDec=fd; }
void setAnchor(const char *a) { anc=a; }
@@ -143,10 +144,8 @@ class MemberDef : public Definition
ExampleList *getExampleList() const { return exampleList; }
// prototype related members
- const char *getDefFile() { return defFile; }
- int getDefLine() { return defLine; }
- void setDecFile(const char *f) { declFile=f; }
- void setDecLine(int l) { defLine=l; }
+ //void setDecFile(const char *f) { declFile=f; }
+ //void setDecLine(int l) { defLine=l; }
// convenience members
bool isSignal() const { return mtype==Signal; }
@@ -219,8 +218,8 @@ class MemberDef : public Definition
QCString declFile; // file where the declaration was found
int declLine; // line where the declaration was found
QCString def; // member definition in code (fully qualified name)
- QCString defFile; // file where the definition was found
- int defLine; // line where the definition was found
+ //QCString defFile; // file where the definition was found
+ //int defLine; // line where the definition was found
QCString anc; // HTML anchor name
Specifier virt; // normal/virtual/pure virtual
Protection prot; // protection type [Public/Protected/Private]
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index 75317d4..dc3529a 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -75,7 +75,7 @@ void MemberGroup::setAnchors()
void MemberGroup::writeDeclarations(OutputList &ol,
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,
@@ -101,8 +101,26 @@ int MemberGroup::countDecMembers()
{
if (numDeclMembers==-1) /* number of member not cached */
{
- memberList->countDecMembers(TRUE);
+ memberList->countDecMembers(TRUE,TRUE);
numDeclMembers = memberList->totalCount();
}
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();
+ }
+ }
+}
diff --git a/src/membergroup.h b/src/membergroup.h
index 1b54596..37fa9dd 100644
--- a/src/membergroup.h
+++ b/src/membergroup.h
@@ -53,6 +53,7 @@ class MemberGroup /* : public Definition */
bool allMembersInSameSection() { return inSameSection; }
void addToDeclarationSection();
int countDecMembers();
+ void distributeMemberGroupDocumentation();
private:
MemberList *memberList; // list of all members in the group
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index 430fb2d..e15f36a 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -44,13 +44,16 @@ int MemberList::compareItems(GCI item1, GCI item2)
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;
m_count=0;
MemberDef *md=first();
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) &&
(!Config::hideMemberFlag || md->hasDocumentation()) &&
(
@@ -60,7 +63,8 @@ void MemberList::countDecMembers(bool inGroup)
(md->isEnumerate() &&
md->hasDocumentedEnumValues()
)
- ) && inGroup==(md->getMemberGroup()!=0) &&
+ ) &&
+ inGroup==(md->getMemberGroup()!=0) &&
!(inGroup && md->protection()==Private && !Config::extractPrivateFlag)
)
{
@@ -88,17 +92,18 @@ void MemberList::countDecMembers(bool inGroup)
}
md=next();
}
- if (memberGroupList && !inGroup)
+ if (memberGroupList && countSubGroups)
{
MemberGroupListIterator mgli(*memberGroupList);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
- //printf("memberGroupList adding %d inGroup=%d\n",
- // mg->countDecMembers(),m_count);
- m_count+=mg->countDecMembers();
+ int mgCount = mg->countDecMembers();
+ //printf("memberGroupList adding %d inGroup=%d\n",mgCount,inGroup);
+ m_count+=mgCount;
}
}
+ //printf("----- end countDecMembers ----\n");
//printf("MemberList::countDecMembers(%d)=%d\n",inGroup,m_count);
}
@@ -147,12 +152,13 @@ MemberListIterator::MemberListIterator(const QList<MemberDef> &l) :
void MemberList::writePlainDeclarations(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
- bool inGroup
+ bool inGroup,bool countSubGroups
)
{
- countDecMembers(inGroup);
- //printf("writePlainDeclaration() totalCount()=%d defineCount()=%d\n",totalCount(),defineCount());
+ //printf("----- writePlainDeclaration() ----\n");
+ countDecMembers(inGroup,countSubGroups);
if (totalCount()==0) return; // no members in this list
+ //printf("----> writePlainDeclaration() inGroup=%d totalCount()=%d\n",inGroup,totalCount());
ol.pushGeneratorState();
@@ -163,6 +169,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (defineCount()>0)
{
+ //printf("There are %d defines\n",defineCount());
if (sectionPerType)
{
ol.startMemberHeader();
@@ -191,6 +198,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (protoCount()>0)
{
+ //printf("There are %d prototypes\n",protoCount());
if (sectionPerType)
{
ol.startMemberHeader();
@@ -214,6 +222,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (typedefCount()>0)
{
+ //printf("There are %d typedefs\n",typedefCount());
if (sectionPerType)
{
ol.startMemberHeader();
@@ -236,6 +245,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
// write enums
if (enumCount()>0)
{
+ //printf("There are %d enums\n",enumCount());
if (sectionPerType)
{
ol.startMemberHeader();
@@ -357,6 +367,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
{
ol.startMemberDescription();
parseDoc(ol,
+ md->getDefFileName(),md->getDefLine(),
cd?cd->name().data():0,md->name().data(),
md->briefDescription()
);
@@ -384,6 +395,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
// write functions
if (funcCount()>0)
{
+ //printf("There are %d functions\n",funcCount());
if (sectionPerType)
{
ol.startMemberHeader();
@@ -408,6 +420,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (friendCount()>0)
{
+ //printf("There are %d friends\n",friendCount());
MemberListIterator mli(*this);
for ( ; (md=mli.current()) ; ++mli )
{
@@ -455,6 +468,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
// write variables
if (varCount()>0)
{
+ //printf("There are %d variables\n",varCount());
if (sectionPerType)
{
ol.startMemberHeader();
@@ -483,6 +497,7 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (md->fromAnnonymousScope() && !md->annonymousDeclShown()
&& inGroup==(md->getMemberGroup()!=0))
{
+ //printf("annonymous compound members\n");
md->setFromAnnonymousScope(FALSE);
md->writeDeclaration(ol,cd,nd,fd,gd,inGroup);
md->setFromAnnonymousScope(TRUE);
@@ -493,16 +508,28 @@ void MemberList::writePlainDeclarations(OutputList &ol,
if (!sectionPerType) { ol.endMemberList(); /*ol.writeChar('\n');*/ }
ol.popGeneratorState();
+ //printf("----- end writePlainDeclaration() ----\n");
}
void MemberList::writeDeclarations(OutputList &ol,
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",
- // title,subtitle);
- countDecMembers(inGroup);
- if (totalCount()==0) return;
+ //printf("MemberList::writeDeclaration(title=`%s',subtitle=`%s')\n",title,subtitle);
+ //printf("----- writeDeclaration() ----\n");
+ countDecMembers(FALSE,countSubGroups); // count member not in group
+ 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)
{
ol.startMemberHeader();
@@ -514,13 +541,13 @@ void MemberList::writeDeclarations(OutputList &ol,
//printf("subtitle=`%s'\n",subtitle);
ol.startMemberSubtitle();
if (inGroup)
- parseDoc(ol,0,0,subtitle);
+ parseDoc(ol,"<generated>",1,0,0,subtitle);
else
parseText(ol,subtitle);
ol.endMemberSubtitle();
}
- writePlainDeclarations(ol,cd,nd,fd,gd,inGroup);
+ writePlainDeclarations(ol,cd,nd,fd,gd,inGroup,FALSE);
if (memberGroupList)
{
@@ -530,13 +557,17 @@ void MemberList::writeDeclarations(OutputList &ol,
while ((mg=mgli.current()))
{
ol.startMemberGroupHeader();
- parseText(ol,mg->header());
+ if (mg->header()!="[NOHEADER]")
+ {
+ parseText(ol,mg->header());
+ }
ol.endMemberGroupHeader();
if (!mg->documentation().isEmpty())
{
//printf("Member group has docs!\n");
ol.startMemberGroupDocs();
- parseDoc(ol,0,0,mg->documentation());
+ parseDoc(ol,"<generated>",1,
+ 0,0,mg->documentation());
ol.endMemberGroupDocs();
}
ol.startMemberGroup();
@@ -545,6 +576,7 @@ void MemberList::writeDeclarations(OutputList &ol,
ol.endMemberGroup(mgli.current()==0);
}
}
+ //printf("----- end writeDeclaration() ----\n");
}
diff --git a/src/memberlist.h b/src/memberlist.h
index 239d5f7..8346c8f 100644
--- a/src/memberlist.h
+++ b/src/memberlist.h
@@ -41,7 +41,7 @@ class MemberList : public QList<MemberDef>
int protoCount() const { return protoCnt; }
int defineCount() const { return defCnt; }
int friendCount() const { return friendCnt; }
- void countDecMembers(bool inGroup);
+ void countDecMembers(bool inGroup,bool countSubGroups);
void countDocMembers();
int totalCount() const
{ return //varCnt+funcCnt+enumCnt+enumValCnt+typeCnt+
@@ -50,10 +50,11 @@ class MemberList : public QList<MemberDef>
}
void writePlainDeclarations(OutputList &ol,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
- bool inGroup=FALSE);
+ bool inGroup=FALSE,bool countSubGroups=TRUE);
void writeDeclarations(OutputList &ol,
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
/*,MemberDef::MemberType m*/);
void addMemberGroup(MemberGroup *mg);
diff --git a/src/message.cpp b/src/message.cpp
index 838182f..678a80a 100644
--- a/src/message.cpp
+++ b/src/message.cpp
@@ -18,6 +18,57 @@
#include <stdarg.h>
#include <stdio.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, ...)
{
@@ -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)
{
@@ -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, ...)
{
va_list args;
diff --git a/src/message.h b/src/message.h
index e125cdd..87022f6 100644
--- a/src/message.h
+++ b/src/message.h
@@ -19,7 +19,10 @@
#define MESSAGE_H
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, ...);
+void initWarningFormat();
#endif
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
index 0507f2a..7c145ec 100644
--- a/src/namespacedef.cpp
+++ b/src/namespacedef.cpp
@@ -27,7 +27,9 @@
#include "doxygen.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);
classList = new ClassList;
@@ -38,6 +40,8 @@ NamespaceDef::NamespaceDef(const char *name,const char *ref) : Definition(name)
memberGroupList = new MemberGroupList;
memberGroupList->setAutoDelete(TRUE);
memberGroupDict = new MemberGroupDict(1009);
+ defFileName = df;
+ defLine = dl;
}
NamespaceDef::~NamespaceDef()
@@ -49,6 +53,15 @@ NamespaceDef::~NamespaceDef()
delete memberGroupDict;
}
+void NamespaceDef::distributeMemberGroupDocumentation()
+{
+ MemberGroupListIterator mgli(*memberGroupList);
+ MemberGroup *mg;
+ for (;(mg=mgli.current());++mgli)
+ {
+ mg->distributeMemberGroupDocumentation();
+ }
+}
void NamespaceDef::insertUsedFile(const char *f)
{
if (files.find(f)==-1) files.append(f);
@@ -130,7 +143,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
OutputList briefOutput(&ol);
if (!briefDescription().isEmpty())
{
- parseDoc(briefOutput,name(),0,briefDescription());
+ parseDoc(briefOutput,defFileName,defLine,name(),0,briefDescription());
ol+=briefOutput;
ol.writeString(" \n");
ol.pushGeneratorState();
@@ -183,7 +196,7 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
}
if (!documentation().isEmpty())
{
- parseDoc(ol,name(),0,documentation()+"\n");
+ parseDoc(ol,defFileName,defLine,name(),0,documentation()+"\n");
ol.newParagraph();
}
ol.endTextBlock();
diff --git a/src/namespacedef.h b/src/namespacedef.h
index 13458c8..d6f4b59 100644
--- a/src/namespacedef.h
+++ b/src/namespacedef.h
@@ -36,7 +36,8 @@ class MemberGroupList;
class NamespaceDef : public Definition
{
public:
- NamespaceDef(const char *name,const char *ref=0);
+ NamespaceDef(const char *defFileName,int defLine,
+ const char *name,const char *ref=0);
~NamespaceDef();
//QCString namespaceFile() const { return fileName; }
QCString getOutputFileBase() const { return fileName; }
@@ -72,6 +73,7 @@ class NamespaceDef : public Definition
{
return isLinkableInProject() || isReference();
}
+ void distributeMemberGroupDocumentation();
private:
//QCString reference;
diff --git a/src/pre.l b/src/pre.l
index 9e7a241..34f187f 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -171,12 +171,12 @@ static FILE *findFile(const char *fileName)
{
QCString cmd = Config::inputFilter+" "+absName;
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
{
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)
{
@@ -761,7 +761,9 @@ void addDefine()
{
//bool 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);
if (!g_defArgsStr.isEmpty())
{
@@ -773,8 +775,8 @@ void addDefine()
//printf("Setting initializer for `%s' to `%s'\n",g_defName.data(),g_defText.data());
md->setInitializer(g_defLitText);
- md->setDefFile(g_yyFileName);
- md->setDefLine(g_yyLineNr);
+ //md->setDefFile(g_yyFileName);
+ //md->setDefLine(g_yyLineNr);
md->setFileDef(g_yyFileDef);
md->setDefinition("#define "+g_defName);
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index d8a17c7..55a3a11 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -1665,7 +1665,7 @@ void RTFGenerator::incrementIndentLevel()
m_listLevel++;
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;
}
}
@@ -1675,7 +1675,7 @@ void RTFGenerator::decrementIndentLevel()
m_listLevel--;
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;
}
}
diff --git a/src/scanner.h b/src/scanner.h
index ddb63c0..40add67 100644
--- a/src/scanner.h
+++ b/src/scanner.h
@@ -29,8 +29,10 @@
class OutputList;
extern void parseMain(Entry *);
-extern void parseDoc(OutputList &ol,const char *clName, const char *memName,
- const QCString &docString);
+extern void parseDoc(OutputList &ol,
+ const char *fileName,int startLine,
+ const char *clName, const char *memName,
+ const QCString &docString);
extern void parseExample(OutputList &ol,const QCString &docString,
const char *fileName);
extern void parseText(OutputList &ol,const QCString &txtString);
diff --git a/src/scanner.l b/src/scanner.l
index 6f2fea7..a976a68 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -56,7 +56,6 @@
static bool insideArgumentList;
static QCString className;
static QCString memberName;
-static QCString refName;
static OutputList * outDoc;
static QCString code;
static QCString linkRef;
@@ -98,9 +97,9 @@ static Entry* global_root = 0 ;
static Entry* current = 0 ;
static Entry* previous = 0 ;
static Entry* tempEntry = 0 ;
-static int yyLineNr = 0 ;
+static int yyLineNr = 1 ;
static int anonCount = 0 ;
-static char yyFileName[2048] ;
+static char yyFileName[4096] ;
static int lastMemberGroupLine;
static bool sig;
static bool slot;
@@ -179,7 +178,6 @@ static void initParser()
insideArgumentList=FALSE;
className.resize(0);
memberName.resize(0);
- refName="<unknown>";
code.resize(0);
linkRef.resize(0);
linkText.resize(0);
@@ -415,15 +413,18 @@ static void includeFile(OutputList &ol,const char *fileName,bool quiet)
}
else if (ambig)
{
- warn("Include file name %s is ambigious.\n",fileName);
- warn("Possible candidates:\n");
- //includeFileList.writeMatches(fileName);
- showFileDefMatches(&exampleNameDict,fileName);
+ QCString text;
+ text.sprintf("Include file name %s is ambigious.\n",fileName);
+ text+="Possible candidates:\n";
+ text+=showFileDefMatches(&exampleNameDict,fileName);
+ warn(yyFileName,yyLineNr,text);
}
else
{
- warn("Warning: example file %s is not found. ",fileName);
- warn("Check your EXAMPLE_PATH\n");
+ warn(yyFileName,yyLineNr,
+ "Warning: example file %s is not found. "
+ "Check your EXAMPLE_PATH",fileName
+ );
}
}
@@ -440,14 +441,17 @@ static void verbIncludeFile(OutputList &ol,const char *name)
}
else if (ambig)
{
- warn("Include file name %s is ambigious.\n",name);
- warn("Possible candidates:\n");
- showFileDefMatches(&exampleNameDict,name);
+ QCString text;
+ text.sprintf("Include file name %s is ambigious.\n",name);
+ text+=("Possible candidates:\n");
+ text+=showFileDefMatches(&exampleNameDict,name);
+ warn(yyFileName,yyLineNr,text);
}
else
{
- warn("Warning: example file %s is not found. ",name);
- warn("Check your EXAMPLE_PATH\n");
+ warn(yyFileName,yyLineNr,
+ "Warning: example file %s is not found. "
+ "Check your EXAMPLE_PATH",name);
}
}
@@ -619,7 +623,8 @@ static void addListItemMarker(const char *marker)
if (listIndentStack.isEmpty())
{
insideItemList=FALSE;
- warn("Warning: list item with invalid indent found!\n");
+ warn(yyFileName,yyLineNr,
+ "Warning: list item with invalid indent found!");
}
else
{
@@ -690,7 +695,8 @@ static void addSection()
}
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()
)
{
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)
}
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
{
- warn("Warning: could not open image %s\n",fileName);
+ warn(yyFileName,yyLineNr,
+ "Warning: could not open image %s",fileName);
}
}
else if (ambig)
{
- warn("Warning: image file name %s is ambigious.\n",fileName);
- warn("Possible candidates:\n");
- //includeFileList.writeMatches(fileName);
- showFileDefMatches(&imageNameDict,fileName);
+ QCString text;
+ text.sprintf("Warning: image file name %s is ambigious.\n",fileName);
+ text+="Possible candidates:\n";
+ text+=showFileDefMatches(&imageNameDict,fileName);
+ warn(yyFileName,yyLineNr,text);
}
else
{
result=fileName;
if (result.left(5)!="http:")
{
- warn("Warning: image file %s is not found in IMAGE_PATH: "
- "assuming external image.\n",fileName);
+ warn(yyFileName,yyLineNr,
+ "Warning: image file %s is not found in IMAGE_PATH: "
+ "assuming external image.",fileName
+ );
}
}
return result;
@@ -930,7 +941,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
%x DefineArg
%x DefineEnd
%x Include
-%x ClassName
+%x CompoundName
%x ClassVar
%x ClassTemplSpec
%x Bases
@@ -1084,7 +1095,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<*>\x06[^\x06]*\x06 { // new file
if (memberGroupId!=NOGROUP)
{
- warn("Warning: Missing //@} in file %s\n",yyFileName);
+ warn(yyFileName,yyLineNr,"Warning: Missing //@}");
memberGroupId=NOGROUP;
}
yyLineNr= 0 ; // there is always an extra newline at the start of the file
@@ -1246,8 +1257,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
BEGIN( DocScan );
}
*/
-<DocScan>{CMD}"endlink"/[^a-z_A-Z0-9] { warn("Warning: \\endlink without \\link "
- "in documentation of %s\n", refName.data());
+<DocScan>{CMD}"endlink"/[^a-z_A-Z0-9] { warn(yyFileName,yyLineNr,
+ "Warning: \\endlink without \\link "
+ "in documentation."
+ );
}
<DocScan>{CMD}"addindex"/{BN} {
BEGIN(DocIndexWord);
@@ -1620,8 +1633,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<DocScan>{CMD}"endif"/[^a-z_A-Z0-9] {
if (--depthIf<0)
{
- warn("Warning: documentation block contains \\endif without "
- "matching \\if found in documentation of %s!",refName.data());
+ warn(yyFileName,yyLineNr,
+ "Warning: documentation block contains \\endif without "
+ "matching \\if found in documentation."
+ );
}
else
{
@@ -1657,8 +1672,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
}
else if (!generateLink(*outDoc,className,yytext,TRUE,0))
{
- warn("Warning: reference to unknown section %s!\n",yytext);
- outDoc->writeBoldString(" unknown reference!");
+ warn(yyFileName,yyLineNr,"Warning: reference to unknown section %s!",yytext);
+ outDoc->writeBoldString(" unknown reference! ");
}
BEGIN(DocScan);
}
@@ -1687,8 +1702,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
}
else if (!generateLink(*outDoc,className,sectionRef,TRUE,text))
{
- warn("Warning: reference to unknown section %s!\n",sectionRef.data());
- outDoc->writeBoldString("unknown reference!");
+ warn(yyFileName,yyLineNr,"Warning: reference to unknown section %s!",sectionRef.data());
+ outDoc->writeBoldString(" unknown reference! ");
}
BEGIN(DocScan);
}
@@ -1705,8 +1720,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
}
else
{
- warn("Warning: reference to unknown section %s!\n",sectionRef.data());
- outDoc->writeBoldString("unknown reference!");
+ warn(yyFileName,yyLineNr,"Warning: reference to unknown section %s!",sectionRef.data());
+ outDoc->writeBoldString(" unknown reference! ");
}
BEGIN(DocScan);
}
@@ -1767,10 +1782,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
BEGIN(DocScan);
}
<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 {
- warn("Warning: invalid \\image command found!\n");
+ warn(yyFileName,yyLineNr,"Warning: invalid \\image command found!");
outDoc->enableAll();
BEGIN(DocScan);
}
@@ -1780,8 +1795,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
BEGIN( DocCodeBlock );
}
<DocScan>{CMD}"endcode"/[^a-z_A-Z0-9] {
- warn("Warning: \\endcode without <PRE> or \\code "
- "in the documentation of %s\n",refName.data());
+ warn(yyFileName,yyLineNr,"Warning: \\endcode without <PRE> or \\code "
+ "in the documentation.");
}
<DocScan>{SCOPEMASK}"("[a-z_A-Z0-9,:\<\> \t\*\&]+")" {
generateRef(*outDoc,className,yytext,inSeeBlock);
@@ -1891,13 +1906,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<DocScan>"</"{STRONG}{ATTR}">" { outDoc->endBold(); }
<DocScan>"<"{CENTER}{ATTR}">" { outDoc->startCenter(); }
<DocScan>"</"{CENTER}{ATTR}">" { outDoc->endCenter(); }
-<DocScan>"<"{TABLE}{ATTR}">" {
- startTable();
- /*outDoc->startTable();*/ }
-<DocScan>"</"{TABLE}{ATTR}">" {
- endTable();
- /*outDoc->endTable();*/
- }
+<DocScan>"<"{TABLE}{ATTR}">" { startTable(); }
+<DocScan>"</"{TABLE}{ATTR}">" { endTable(); }
<DocScan>"<"{INPUT}{ATTR}">"
<DocScan>"<"{SMALL}{ATTR}">" { outDoc->startSmall(); }
<DocScan>"</"{SMALL}{ATTR}">" { outDoc->endSmall(); }
@@ -1928,8 +1938,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
BEGIN( DocCodeBlock );
}
<DocScan>"</"{PRE}{ATTR}">" {
- warn("Warning: </PRE> without <PRE> or \\code"
- "in the documentation of %s\n",refName.data());
+ warn(yyFileName,yyLineNr,
+ "Warning: </PRE> without <PRE> or \\code"
+ "in the documentation."
+ );
}
<DocScan>"<"{SUB}{ATTR}">" { outDoc->startSubscript(); }
<DocScan>"</"{SUB}{ATTR}">" { outDoc->endSubscript(); }
@@ -1945,7 +1957,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<DocScan>"</"{OL}{ATTR}">" {
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
{
@@ -1959,7 +1973,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<DocScan>"</"{UL}{ATTR}">" {
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
{
@@ -1980,7 +1996,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<DocScan>"</"{DL}{ATTR}">" {
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
{
@@ -2278,7 +2296,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr;
current->bodyLine = yyLineNr;
lineCount();
- BEGIN( ClassName );
+ BEGIN( CompoundName );
}
<FindMembers>{B}*"module"{BN}+ {
isTypedef=FALSE;
@@ -2288,7 +2306,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr;
current->bodyLine = yyLineNr;
lineCount();
- BEGIN( ClassName );
+ BEGIN( CompoundName );
}
<FindMembers>{B}*"interface"{BN}+ { // M$/Corba IDL interface
isTypedef=FALSE;
@@ -2299,7 +2317,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr;
current->bodyLine = yyLineNr;
lineCount();
- BEGIN( ClassName );
+ BEGIN( CompoundName );
}
<FindMembers>{B}*"exception"{BN}+ { // Corba IDL exception
isTypedef=FALSE;
@@ -2310,7 +2328,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr;
current->bodyLine = yyLineNr;
lineCount();
- BEGIN( ClassName );
+ BEGIN( CompoundName );
}
<FindMembers>{B}*(("typedef"{BN}+)?)"class"{BN}+ {
isTypedef=((QCString)yytext).find("typedef")!=-1;
@@ -2321,7 +2339,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr;
current->bodyLine = yyLineNr;
lineCount() ;
- BEGIN( ClassName ) ;
+ BEGIN( CompoundName ) ;
}
<FindMembers>{B}*(("typedef"{BN}+)?)"struct"{BN}+ {
isTypedef=((QCString)yytext).find("typedef")!=-1;
@@ -2332,7 +2350,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr;
current->bodyLine = yyLineNr;
lineCount() ;
- BEGIN( ClassName ) ;
+ BEGIN( CompoundName ) ;
}
<FindMembers>{B}*(("typedef"{BN}+)?)"union"{BN}+ {
isTypedef=((QCString)yytext).find("typedef")!=-1;
@@ -2343,7 +2361,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr;
current->bodyLine = yyLineNr;
lineCount() ;
- BEGIN( ClassName ) ;
+ BEGIN( CompoundName ) ;
}
<FindMembers>{B}*(("typedef"{BN}+)?)"enum"{BN}+ {
isTypedef=((QCString)yytext).find("typedef")!=-1;
@@ -2354,7 +2372,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr;
current->bodyLine = yyLineNr;
lineCount() ;
- BEGIN( ClassName ) ;
+ BEGIN( CompoundName ) ;
}
<Operator>"("{BN}*")"{BN}*/"(" {
lineCount();
@@ -2689,15 +2707,17 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<FindMembers>"//@{"|"/*@{*/" {
if (memberGroupId!=NOGROUP)
{
- warn("Warning: ignoring nested member group "
- "at line %d of %s. Previous command was found at line %d\n",
- yyLineNr,yyFileName,lastMemberGroupLine);
+ warn(yyFileName,yyLineNr,"Warning: ignoring nested member group. "
+ "Previous command was found at line %d.",lastMemberGroupLine);
}
else if (memberGroupHeader.isEmpty())
{
- warn("Warning: member group has empty header "
- "at line %d of %s.\n",yyLineNr,yyFileName);
- memberGroupHeader="[No header specified!]";
+ //warn("Warning: member group does not have a header "
+ // "at line %d of %s.\n",yyLineNr,yyFileName);
+ memberGroupHeader="[NOHEADER]";
+ memberGroupId = newMemberGroupId();
+ current->mGrpId = memberGroupId;
+ lastMemberGroupLine = yyLineNr;
}
else
{
@@ -2709,8 +2729,8 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<FindMembers>"//@}"|"/*@}*/" {
if (memberGroupId==NOGROUP)
{
- warn("Warning: end of member group without matching begin "
- "at line %d of %s.\n",yyLineNr,yyFileName);
+ warn(yyFileName,yyLineNr,
+ "Warning: end of member group without matching begin.");
}
else
{
@@ -3708,7 +3728,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<SkipString>. {
//addToBodyCond(yytext);
}
-<Bases,ClassName>";" {
+<Bases,CompoundName>";" {
current->section = Entry::EMPTY_SEC ;
current->type.resize(0) ;
current->name.resize(0) ;
@@ -3716,7 +3736,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->argList->clear();
BEGIN( FindMembers ) ;
}
-<ClassName>{SCOPENAME}{BN}*/"<" {
+<CompoundName>{SCOPENAME}{BN}*/"<" {
sharpCount = 0;
current->name = yytext ;
lineCount();
@@ -3739,7 +3759,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
<ClassTemplSpec>. {
current->name += yytext;
}
-<ClassName>{SCOPENAME} {
+<CompoundName>{SCOPENAME} {
current->name = yytext ;
lineCount();
BEGIN( ClassVar );
@@ -3790,7 +3810,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
}
BEGIN( FindMembers );
}
-<ClassName,ClassVar>{B}*"{"{B}* { current->fileName = yyFileName ;
+<CompoundName,ClassVar>{B}*"{"{B}* { current->fileName = yyFileName ;
current->startLine = yyLineNr ;
current->name = removeRedundantWhiteSpace(current->name);
if (current->name.isEmpty() && !isTypedef) // anonymous compound
@@ -4014,7 +4034,7 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
BEGIN( tmpDocType );
}
<JavaDoc>"<"{TABLE}{ATTR}">" {
- current->doc+=yytext;
+ //current->doc+=yytext;
int i;
for (i=yyleng-1;i>=0;i--)
{
@@ -4131,6 +4151,15 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
current->startLine = yyLineNr;
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}+ {
//printf("--> mgroup found!\n");
current->section = Entry::MEMBERGRP_SEC;
@@ -4160,8 +4189,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
}
<NameSpaceDocArg1>"\\"{B}*"\n" { yyLineNr++; }
<NameSpaceDocArg1>"\n" {
- warn("Warning: missing argument after "
- "\\namespace at line %d of %s.\n",yyLineNr,yyFileName);
+ warn(yyFileName,yyLineNr,
+ "Warning: missing argument after "
+ "\\namespace."
+ );
yyLineNr++;
}
<ClassDocArg1>{SCOPENAME}/"<" {
@@ -4185,8 +4216,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
}
<ClassDocArg1>"\\"{B}*"\n" { yyLineNr++; }
<ClassDocArg1>"\n" {
- warn("Warning: missing argument after "
- "\\class at line %d of %s.\n",yyLineNr,yyFileName);
+ warn(yyFileName,yyLineNr,
+ "Warning: missing argument after "
+ "\\class."
+ );
yyLineNr++;
}
@@ -4198,8 +4231,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
}
<GroupDocArg1>"\\"{B}*"\n" { yyLineNr++; }
<GroupDocArg1>"\n" {
- warn("Warning: missing argument after "
- "\\defgroup at line %d of %s.\n",yyLineNr,yyFileName);
+ warn(yyFileName,yyLineNr,
+ "Warning: missing argument after "
+ "\\defgroup."
+ );
yyLineNr++;
BEGIN( Doc );
}
@@ -4252,8 +4287,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
}
<PageDocArg1>"\\"{B}*"\n" { yyLineNr++; }
<PageDocArg1>"\n" {
- warn("Warning: missing argument after "
- "\\page at line %d of %s.\n",yyLineNr,yyFileName);
+ warn(yyFileName,yyLineNr,
+ "Warning: missing argument after "
+ "\\page."
+ );
yyLineNr++;
BEGIN( Doc );
}
@@ -4272,8 +4309,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
}
<EnumDocArg1>"\\"{B}*"\n" { yyLineNr++; }
<EnumDocArg1>"\n" {
- warn("Warning: missing argument after "
- "\\enum at line %d of %s.\n",yyLineNr,yyFileName);
+ warn(yyFileName,yyLineNr,
+ "Warning: missing argument after \\enum."
+ );
yyLineNr++;
BEGIN( Doc );
}
@@ -4507,6 +4545,9 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
lineCount();
BEGIN( GroupName );
}
+<ClassDoc,LineDoc,Doc,JavaDoc>{CMD}"nosubgrouping"/[^a-z_A-Z0-9] {
+ current->subGrouping = FALSE;
+ }
<GroupName>{ID} {
current->groups->append(
new QCString(yytext)
@@ -4696,9 +4737,10 @@ DOCPARAM ([a-z_A-Z0-9:\.\-]+)|("\"".*"\"")
}
<ClassDocRelates,ClassDocFunc,ClassDocDefine,GroupDocArg1,ClassDocArg1,SectionTitle,EnumDocArg1,PageDocArg1,ExampleDocArg1,ClassDefineArgs,GroupName>"*/" {
current->doc += "\n\n";
- err("Warning: unexpected end of "
- "documentation block found in "
- "file %s at line %d\n",yyFileName,yyLineNr);
+ warn(yyFileName,yyLineNr,
+ "Warning: unexpected end of "
+ "documentation block."
+ );
BEGIN( lastDocContext );
}
<FileDocArg1>"*/" {
@@ -4905,27 +4947,13 @@ void parseDocument(OutputList &ol,const QCString &docString)
if (inBlock()) endBlock();
if (currentListIndentLevel>0)
{
- if (!refName.isEmpty())
- {
- 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);
- }
+ warn(yyFileName,yyLineNr,"Warning: Documentation ended in the middle "
+ "of a list (indent level %d)!",currentListIndentLevel);
}
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())
{
@@ -4933,7 +4961,9 @@ void parseDocument(OutputList &ol,const QCString &docString)
}
if (insideVerbatim)
{
- warn("Warning: file ended inside a \\verbatim block!\n");
+ warn(yyFileName,yyLineNr,
+ "Warning: file ended inside a \\verbatim block!"
+ );
}
ol+=*outDoc;
delete outDoc; outDoc=0;
@@ -4942,27 +4972,17 @@ void parseDocument(OutputList &ol,const QCString &docString)
//----------------------------------------------------------------------------
-void parseDoc(OutputList &ol,const char *clName,
- const char *memName,const QCString &docString)
+void parseDoc(OutputList &ol,const char *fileName,int startLine,
+ 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();
initParseCodeContext();
exampleDoc=FALSE; // do not cross reference with member docs
className=clName;
memberName=memName;
- if (memName)
- {
- refName=className+"::"+memberName;
- }
- else if (clName)
- {
- refName=className;
- }
- else
- {
- refName="<unknown>";
- }
+ strcpy(yyFileName,fileName);
+ yyLineNr = startLine;
parseDocument(ol,docString);
}
@@ -4992,7 +5012,7 @@ void parseExample(OutputList &ol,const QCString &docString,
initParseCodeContext();
exampleDoc=TRUE; // cross reference with member docs
exampleName=fileName;
- refName="example "+exampleName;
+ strcpy(yyFileName,fileName);
parseDocument(ol,docString);
}
diff --git a/src/tag.l b/src/tag.l
index 6215605..7b37851 100644
--- a/src/tag.l
+++ b/src/tag.l
@@ -54,7 +54,7 @@ static void addClass(const char *name,const char *fileName)
//printf("adding class %s\n",name);
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;
nd = 0;
classList.inSort(cd);
@@ -92,7 +92,7 @@ static void addNamespace(const char *name)
// since namespace are open, this need not to be the case. As a result
// namespace may contain members that are located in
// different namespaces!
- nd = new NamespaceDef(name,tagName);
+ nd = new NamespaceDef("<tagfile>",1,name,tagName);
namespaceList.inSort(nd);
namespaceDict.insert(name,nd);
}
@@ -110,7 +110,8 @@ static void addMember(const char *name,const char *anchor,const char *args)
MemberDef *md;
ArgumentList *argList = new ArgumentList;
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);
delete argList;
md->setAnchor(anchor);
diff --git a/src/translator.h b/src/translator.h
index 8f4e03c..89ef47b 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -793,7 +793,7 @@ class Translator
/*! Text shown before a multi-line variable/enum initialization */
virtual QCString trInitialValue()
{
- return "Initial value:";
+ return "Initializer:";
}
/*! Text used the source code in the file index */
virtual QCString trCode()
diff --git a/src/util.cpp b/src/util.cpp
index f20f8ab..275b754 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -221,7 +221,7 @@ ClassDef *getResolvedClass(const char *name)
}
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];
}
else
@@ -734,7 +734,7 @@ QCString fileToString(const char *name)
QFileInfo fi(name);
if (!fi.exists() || !fi.isFile())
{
- warn("Error: file `%s' not found\n",name);
+ err("Error: file `%s' not found\n",name);
return "";
}
f.setName(name);
@@ -742,7 +742,7 @@ QCString fileToString(const char *name)
}
if (!fileOpened)
{
- warn("Error: cannot open file `%s' for reading\n",name);
+ err("Error: cannot open file `%s' for reading\n",name);
return "";
}
int fsize=f.size();
@@ -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 path;
int slashPos=QMAX(name.findRev('/'),name.findRev('\\'));
@@ -2104,11 +2105,12 @@ void showFileDefMatches(const FileNameDict *fnDict,const char *n)
{
if (path.isEmpty() || fd->getPath().right(path.length())==path)
{
- msg(" %s\n",fd->absFilePath().data());
+ result+=" %s\n",fd->absFilePath().data();
}
fd=fn->next();
}
}
+ return result;
}
//----------------------------------------------------------------------
@@ -2281,11 +2283,15 @@ QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &te
if (!templ.isEmpty() && scope.find('<')==-1)
{
int si,pi=0;
- while ((si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ)
- && !getClass(scope.left(si)))
- { //printf("Tried `%s'\n",(scope.left(si)+templ).data());
- pi=si+2;
- }
+ ClassDef *cd=0;
+ while (
+ (si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ) &&
+ ((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
{
result+=templ;
diff --git a/src/util.h b/src/util.h
index 316963b..597459b 100644
--- a/src/util.h
+++ b/src/util.h
@@ -65,7 +65,7 @@ extern ClassDef *getClass(const char *key);
extern ClassDef *getResolvedClass(const char *key);
extern FileDef *findFileDef(const FileNameDict *fnDict,const char *n,
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 bool isId(char c);
extern QCString removeRedundantWhiteSpace(const QCString &s);