diff options
49 files changed, 1230 insertions, 869 deletions
@@ -1,4 +1,4 @@ -DOXYGEN Version 1.1.3-20000514 +DOXYGEN Version 1.1.3-20000522 CONTENTS -------- @@ -15,8 +15,8 @@ INSTALLATION INSTRUCTIONS FOR UNIX: 1. Unpack the archive, unless you already have: - gunzip doxygen-1.1.3-20000514.src.tar.gz # uncompress the archive - tar xf doxygen-1.1.3-20000514.src.tar # unpack it + gunzip doxygen-1.1.3-20000522.src.tar.gz # uncompress the archive + tar xf doxygen-1.1.3-20000522.src.tar # unpack it 2. Run the configure script: @@ -252,4 +252,4 @@ The latest version of doxygen can be obtained at Enjoy, -Dimitri van Heesch (14 May 2000) +Dimitri van Heesch (22 May 2000) @@ -1,4 +1,4 @@ -DOXYGEN Version 1.1.3-20000514 +DOXYGEN Version 1.1.3-20000522 Please read INSTALL for compilation instructions. @@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at Enjoy, -Dimitri van Heesch (14 May 2000) +Dimitri van Heesch (22 May 2000) @@ -1 +1 @@ -1.1.3-20000514 +1.1.3-20000522 diff --git a/addon/configgen/config_templ.l b/addon/configgen/config_templ.l index 3588a42..a7b1289 100644 --- a/addon/configgen/config_templ.l +++ b/addon/configgen/config_templ.l @@ -40,13 +40,16 @@ 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); vfprintf(stderr, fmt, args); va_end(args); } +void initWarningFormat() +{ +} #else #include "doxygen.h" #include "message.h" @@ -183,7 +186,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); } @@ -248,7 +251,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(); @@ -288,7 +291,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; @@ -304,7 +307,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; } @@ -341,7 +344,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! */ { @@ -354,10 +358,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 @@ -424,6 +428,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()) @@ -715,7 +742,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/addon/configgen/configgen.cpp b/addon/configgen/configgen.cpp index dd45913..cc51c4c 100644 --- a/addon/configgen/configgen.cpp +++ b/addon/configgen/configgen.cpp @@ -775,21 +775,7 @@ void init() ConfigString::addFixedValue("outputLanguage","Japanese"); ConfigString::addFixedValue("outputLanguage","Finnish"); ConfigString::addFixedValue("outputLanguage","Spanish"); - ConfigBool::add( "quietFlag", - "QUIET", - "FALSE", - "generate progress messages flag", - "The QUIET tag can be used to turn on/off the messages that are generated \n" - "by doxygen. Possible values are YES and NO. If left blank NO is used. \n" - ); - ConfigBool::add( "warningFlag", - "WARNINGS", - "TRUE", - "generate warnings flag", - "The WARNINGS tag can be used to turn on/off the warning messages that are \n" - "generated by doxygen. Possible values are YES and NO. If left blank \n" - "NO is used. \n" - ); + ConfigString::addFixedValue("outputLanguage","Croatian"); ConfigBool::add( "noIndexFlag", "DISABLE_INDEX", "FALSE", @@ -984,6 +970,41 @@ void init() "documentation sections, marked by \\if sectionname ... \\endif. \n" ); //----------------------------------------------------------------------------------------------- + ConfigInfo::add( "Messages","configuration options related to warning and progress messages"); + //----------------------------------------------------------------------------------------------- + ConfigBool::add( "quietFlag", + "QUIET", + "FALSE", + "generate progress messages flag", + "The QUIET tag can be used to turn on/off the messages that are generated \n" + "by doxygen. Possible values are YES and NO. If left blank NO is used. \n" + ); + ConfigBool::add( "warningFlag", + "WARNINGS", + "TRUE", + "generate warnings flag", + "The WARNINGS tag can be used to turn on/off the warning messages that are \n" + "generated by doxygen. Possible values are YES and NO. If left blank \n" + "NO is used. \n" + ); + ConfigBool::add( "warningUndocFlag", + "WARN_IF_UNDOCUMENTED", + "TRUE", + "generate undocumented warnings", + "If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings \n" + "for undocumented members. If EXTRACT_ALL is set to YES then this flag will \n" + "automatically be disabled. \n" + ); + ConfigString::add("warnFormat", + "WARN_FORMAT", + "$file:$line: $text", + "format of the warning messages", + "The WARN_FORMAT tag determines the format of the warning messages that \n" + "doxygen can produce. The string should contain the $file, $line, and $text \n" + "tags, which will be replaced by the file and line number from which the \n" + "warning originated and the warning text. \n" + ); + //----------------------------------------------------------------------------------------------- ConfigInfo::add( "Input","configuration options related to the input files"); //----------------------------------------------------------------------------------------------- ConfigList::add( "inputSources", diff --git a/addon/doxywizard/doxywizard_templ.cpp b/addon/doxywizard/doxywizard_templ.cpp index 4ec430d..cdc1145 100644 --- a/addon/doxywizard/doxywizard_templ.cpp +++ b/addon/doxywizard/doxywizard_templ.cpp @@ -13,6 +13,7 @@ */ #include <stdio.h> +#include <stdlib.h> #include <qmainwindow.h> #include <qpopupmenu.h> #include <qfileinfo.h> diff --git a/doc/commands.doc b/doc/commands.doc index b0fdee8..c715160 100644 --- a/doc/commands.doc +++ b/doc/commands.doc @@ -87,6 +87,7 @@ documentation: <li> \refitem cmdmainpage \mainpage <li> \refitem cmdname \name <li> \refitem cmdnamespace \namespace +<li> \refitem cmdnosubgrouping \nosubgrouping <li> \refitem cmdoverload \overload <li> \refitem cmdpage \page <li> \refitem cmdpar \par @@ -367,6 +368,14 @@ See section \ref memgroup for an example. namespace with name \<name\>. <hr> +\subsection cmdnosubgrouping \nosubgrouping + +This command can be put in the documentation +of a class. It can be used in combination with member grouping +to avoid that doxygen puts a member group as a subgroup of a +Public/Protected/Private/... section. + +<hr> \subsection cmdoverload \overload [(function declaration)] \addindex \overload diff --git a/doc/faq.doc b/doc/faq.doc index ecc8ef4..8e3bc1b 100644 --- a/doc/faq.doc +++ b/doc/faq.doc @@ -147,11 +147,21 @@ QTime and QIODevice classes. Another reason is for the nice and bug free utility classes, like QList, QDict, QString, QArray, QTextStream, QRegExp etc. +The GUI front-end doxywizard uses Qt for... well... the GUI! + <li><b>Can use doxygen on my Java code?</b> No, at the moment there is no support for Java. I suggest to use Sun's JavaDoc instead. +<li><b>How can I exclude all test directories from my directory tree?</b> + +Simply put an exclude pattern like this in the configuration file: + +\verbatim +EXCLUDE_PATTERNS = */test/* +\endverbatim + </ol> \htmlonly diff --git a/doc/starting.doc b/doc/starting.doc index cd52250..e3e67e1 100644 --- a/doc/starting.doc +++ b/doc/starting.doc @@ -493,13 +493,16 @@ detailed information about the group. Nesting of member groups is not allowed. -If all members of a member group have the same type and protection level -(for instance all are static public members), then the whole member -group is displayed as a subgroup of the type/protection level group -(the group is displayed as a subsection of the "Static Public Members" -section for instance). If two or more members have different types, -then the group is put at the same level as the automatically -generated groups. +If all members of a member group inside a class have the same type +and protection level (for instance all are static public members), +then the whole member group is displayed as a subgroup of +the type/protection level group (the group is displayed as a +subsection of the "Static Public Members" section for instance). +If two or more members have different types, then the group is put +at the same level as the automatically generated groups. +If you want to force all member-groups of a class to be at the top level, +you should put a \ref cmdnosubgrouping "\\nosubgrouping" command inside the +documentation of the class. \par Example: \verbinclude memgrp.cpp diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec index 06ac192..c15f207 100644 --- a/packages/rpm/doxygen.spec +++ b/packages/rpm/doxygen.spec @@ -1,5 +1,5 @@ Name: doxygen -Version: 1.1.3-20000514 +Version: 1.1.3-20000522 Summary: documentation system for C, C++ and IDL Release: 1 Source0: doxygen-%{version}.src.tar.gz 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 @@ -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; @@ -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); } @@ -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; @@ -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); |