diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/code.l | 42 | ||||
-rw-r--r-- | src/compound.xsd | 30 | ||||
-rw-r--r-- | src/compound_xsd.h | 30 | ||||
-rw-r--r-- | src/config.l | 1 | ||||
-rw-r--r-- | src/defargs.l | 4 | ||||
-rw-r--r-- | src/dirdef.cpp | 46 | ||||
-rw-r--r-- | src/dirdef.h | 6 | ||||
-rw-r--r-- | src/dot.cpp | 35 | ||||
-rw-r--r-- | src/doxygen.cpp | 17 | ||||
-rw-r--r-- | src/filedef.cpp | 7 | ||||
-rw-r--r-- | src/filedef.h | 1 | ||||
-rw-r--r-- | src/groupdef.cpp | 63 | ||||
-rw-r--r-- | src/groupdef.h | 10 | ||||
-rw-r--r-- | src/htmlgen.cpp | 14 | ||||
-rw-r--r-- | src/index.cpp | 15 | ||||
-rw-r--r-- | src/memberdef.cpp | 36 | ||||
-rw-r--r-- | src/memberlist.cpp | 7 | ||||
-rw-r--r-- | src/namespacedef.cpp | 1 | ||||
-rw-r--r-- | src/pre.l | 3 | ||||
-rw-r--r-- | src/scanner.l | 30 | ||||
-rw-r--r-- | src/search_php.h | 1 | ||||
-rw-r--r-- | src/tagreader.cpp | 58 | ||||
-rw-r--r-- | src/translator_cn.h | 65 | ||||
-rw-r--r-- | src/translator_cz.h | 56 | ||||
-rw-r--r-- | src/translator_de.h | 69 | ||||
-rw-r--r-- | src/translator_es.h | 2 | ||||
-rw-r--r-- | src/translator_hr.h | 50 | ||||
-rw-r--r-- | src/translator_hu.h | 48 | ||||
-rw-r--r-- | src/translator_it.h | 48 | ||||
-rw-r--r-- | src/translator_pl.h | 48 | ||||
-rw-r--r-- | src/translator_ru.h | 50 | ||||
-rw-r--r-- | src/translator_se.h | 61 | ||||
-rw-r--r-- | src/util.cpp | 180 | ||||
-rw-r--r-- | src/xmldocvisitor.cpp | 6 | ||||
-rw-r--r-- | src/xmlgen.cpp | 4 |
35 files changed, 955 insertions, 189 deletions
@@ -297,9 +297,12 @@ class CallContext virtual ~CallContext() {} void setClass(ClassDef *cd) { - DBG_CTX((stderr,"** Set call context %s (%p)\n",cd==0 ? "<null>" : cd->name().data(),cd)); - m_classList.removeLast(); - m_classList.append(cd); + if (cd) + { + DBG_CTX((stderr,"** Set call context %s (%p)\n",cd==0 ? "<null>" : cd->name().data(),cd)); + m_classList.removeLast(); + m_classList.append(cd); + } } void pushScope() { @@ -744,11 +747,11 @@ static void generateClassOrGlobalLink(BaseCodeDocInterface &ol,char *clName, { className+="-p"; } - ClassDef *cd=0; + ClassDef *cd=0,*lcd=0; MemberDef *md=0; - //printf("generateClassOrGlobalLink(className=%s)\n",className.data()); - if (!g_theVarContext.findVariable(className)) // not a local variable + //fprintf(stderr,"generateClassOrGlobalLink(className=%s)\n",className.data()); + if ((lcd=g_theVarContext.findVariable(className))==0) // not a local variable { Definition *d = g_currentDefinition; //printf("d=%p g_sourceFileDef=%p\n",d,g_currentDefinition); @@ -761,11 +764,12 @@ static void generateClassOrGlobalLink(BaseCodeDocInterface &ol,char *clName, } else { - //printf("is a local variable!\n"); + if (lcd!=VariableContext::dummyContext) g_theCallContext.setClass(lcd); + //fprintf(stderr,"is a local variable!\n"); } if (cd && cd->isLinkable()) // is it a linkable class { - //printf("is linkable class %s\n",clName); + //fprintf(stderr,"is linkable class %s\n",clName); if (g_exampleBlock) { QCString anchor; @@ -926,7 +930,9 @@ static bool generateClassMemberLink(BaseCodeDocInterface &ol,ClassDef *mcd,const } } - g_theCallContext.setClass(stripClassName(xmd->typeString())); + ClassDef *typeClass = stripClassName(xmd->typeString()); + //fprintf(stderr,"%s -> typeName=%p\n",xmd->typeString(),typeClass); + g_theCallContext.setClass(typeClass); Definition *xd = xmd->getOuterScope()==Doxygen::globalScope ? xmd->getBodyDef() : xmd->getOuterScope(); @@ -1755,7 +1761,8 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) BEGIN( Body ); } <ClassName,ClassVar>[*&]+ { - addType(); + g_type=g_curClassName; + g_name.resize(0); g_code->codify(yytext); BEGIN( Body ); // variable of type struct * } @@ -2121,6 +2128,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) <MemberCall>{SCOPENAME}/{B}* { if (g_theCallContext.getClass()) { + //fprintf(stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getClass()); if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext)) { g_code->codify(yytext); @@ -2130,6 +2138,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) } else { + //fprintf(stderr,"no class context!\n"); g_code->codify(yytext); addToSearchIndex(yytext); g_name.resize(0); @@ -2167,7 +2176,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) g_code->codify(yytext); g_saveName = g_name.copy(); g_saveType = g_type.copy(); - if (!g_type.isEmpty()) + if (*yytext!='[' && !g_type.isEmpty()) { if (g_scopeStack.top()!=CLASSBLOCK) { @@ -2175,7 +2184,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) } g_name.resize(0); } - if (*yytext==';') + if (*yytext==';' || *yytext=='=') { g_type.resize(0); g_name.resize(0); @@ -2388,7 +2397,12 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) BEGIN( SkipInits ); } } -<CallEnd,OldStyleArgs>({BN}"const"|"volatile")*{BN}*"{" { +<CallEnd>("const"|"volatile")({BN}+("const"|"volatile"))*{BN}*/";" { + startFontClass("keyword"); + codifyLines(yytext); + endFontClass(); + } +<CallEnd,OldStyleArgs>("const"|"volatile")*({BN}+("const"|"volatile"))*"{" { if (g_insideBody) { g_theVarContext.pushScope(); @@ -2878,6 +2892,7 @@ static void restoreObjCContext() void initParseCodeContext() { + //printf("***initParseCodeContext()\n"); g_theVarContext.clear(); g_codeClassSDict.setAutoDelete(TRUE); g_codeClassSDict.clear(); @@ -2889,6 +2904,7 @@ void parseCode(BaseCodeDocInterface &od,const char *className,const QCString &s, bool exBlock, const char *exName,FileDef *fd, int startLine,int endLine,bool inlineFragment) { + //printf("***parseCode()\n"); if (s.isEmpty()) return; g_code = &od; g_inputString = s; diff --git a/src/compound.xsd b/src/compound.xsd index c35c917..bdbf498 100644 --- a/src/compound.xsd +++ b/src/compound.xsd @@ -216,12 +216,12 @@ <xsd:complexType name="linkType"> <xsd:attribute name="refid" type="xsd:string" /> - <xsd:attribute name="external" type="DoxBool" use="optional"/> + <xsd:attribute name="external" type="xsd:string" use="optional"/> </xsd:complexType> <xsd:complexType name="listingType"> <xsd:sequence> - <xsd:element name="codeline" type="codelineType" maxOccurs="unbounded" /> + <xsd:element name="codeline" type="codelineType" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> @@ -528,12 +528,25 @@ <xsd:attribute name="langid" type="xsd:string" /> </xsd:complexType> - <xsd:group name="docParamListGroup"> + <xsd:complexType name="docParamListType"> <xsd:sequence> - <xsd:element name="parametername" type="docParamName" minOccurs="0" maxOccurs="unbounded" /> + <xsd:element name="parameteritem" type="docParamListItem" minOccurs="0" maxOccurs="unbounded" /> + </xsd:sequence> + <xsd:attribute name="kind" type="DoxParamListKind" /> + </xsd:complexType> + + <xsd:complexType name="docParamListItem"> + <xsd:sequence> + <xsd:element name="parameternamelist" type="docParamNameList" minOccurs="0" maxOccurs="unbounded" /> <xsd:element name="parameterdescription" type="descriptionType" /> </xsd:sequence> - </xsd:group> + </xsd:complexType> + + <xsd:complexType name="docParamNameList"> + <xsd:sequence> + <xsd:element name="parametername" type="docParamName" minOccurs="0" maxOccurs="unbounded" /> + </xsd:sequence> + </xsd:complexType> <xsd:complexType name="docParamName"> <xsd:simpleContent> @@ -543,13 +556,6 @@ </xsd:simpleContent> </xsd:complexType> - <xsd:complexType name="docParamListType"> - <xsd:sequence> - <xsd:group ref="docParamListGroup" maxOccurs="unbounded" /> - </xsd:sequence> - <xsd:attribute name="kind" type="DoxParamListKind" /> - </xsd:complexType> - <xsd:complexType name="docXRefSectType"> <xsd:sequence> <xsd:element name="xreftitle" type="xsd:string" minOccurs="0" maxOccurs="unbounded" /> diff --git a/src/compound_xsd.h b/src/compound_xsd.h index f7a6381..a938f18 100644 --- a/src/compound_xsd.h +++ b/src/compound_xsd.h @@ -216,12 +216,12 @@ "\n" " <xsd:complexType name=\"linkType\">\n" " <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n" -" <xsd:attribute name=\"external\" type=\"DoxBool\" use=\"optional\"/>\n" +" <xsd:attribute name=\"external\" type=\"xsd:string\" use=\"optional\"/>\n" " </xsd:complexType>\n" "\n" " <xsd:complexType name=\"listingType\">\n" " <xsd:sequence>\n" -" <xsd:element name=\"codeline\" type=\"codelineType\" maxOccurs=\"unbounded\" />\n" +" <xsd:element name=\"codeline\" type=\"codelineType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" " </xsd:sequence>\n" " </xsd:complexType>\n" "\n" @@ -528,12 +528,25 @@ " <xsd:attribute name=\"langid\" type=\"xsd:string\" /> \n" " </xsd:complexType>\n" "\n" -" <xsd:group name=\"docParamListGroup\">\n" +" <xsd:complexType name=\"docParamListType\">\n" " <xsd:sequence>\n" -" <xsd:element name=\"parametername\" type=\"docParamName\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" +" <xsd:element name=\"parameteritem\" type=\"docParamListItem\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" +" </xsd:sequence>\n" +" <xsd:attribute name=\"kind\" type=\"DoxParamListKind\" /> \n" +" </xsd:complexType>\n" +"\n" +" <xsd:complexType name=\"docParamListItem\">\n" +" <xsd:sequence>\n" +" <xsd:element name=\"parameternamelist\" type=\"docParamNameList\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" " <xsd:element name=\"parameterdescription\" type=\"descriptionType\" />\n" " </xsd:sequence>\n" -" </xsd:group>\n" +" </xsd:complexType>\n" +"\n" +" <xsd:complexType name=\"docParamNameList\">\n" +" <xsd:sequence>\n" +" <xsd:element name=\"parametername\" type=\"docParamName\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" +" </xsd:sequence>\n" +" </xsd:complexType>\n" "\n" " <xsd:complexType name=\"docParamName\">\n" " <xsd:simpleContent>\n" @@ -543,13 +556,6 @@ " </xsd:simpleContent>\n" " </xsd:complexType>\n" "\n" -" <xsd:complexType name=\"docParamListType\">\n" -" <xsd:sequence>\n" -" <xsd:group ref=\"docParamListGroup\" maxOccurs=\"unbounded\" />\n" -" </xsd:sequence>\n" -" <xsd:attribute name=\"kind\" type=\"DoxParamListKind\" /> \n" -" </xsd:complexType>\n" -"\n" " <xsd:complexType name=\"docXRefSectType\">\n" " <xsd:sequence>\n" " <xsd:element name=\"xreftitle\" type=\"xsd:string\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n" diff --git a/src/config.l b/src/config.l index 96357a5..1b73bbd 100644 --- a/src/config.l +++ b/src/config.l @@ -1113,6 +1113,7 @@ void Config::check() filePatternList.append("*.inc"); filePatternList.append("*.m"); filePatternList.append("*.mm"); + filePatternList.append("*.dox"); #if !defined(_WIN32) // unix => case sensitive match => also include useful uppercase versions filePatternList.append("*.C"); diff --git a/src/defargs.l b/src/defargs.l index 0a5d5ec..da76d9c 100644 --- a/src/defargs.l +++ b/src/defargs.l @@ -283,7 +283,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]* if (fi>=0) { a->type = g_curArgTypeName.left(fi+1); - a->name = g_curArgTypeName.mid(fi+1,bi-fi-1); + a->name = g_curArgTypeName.mid(fi+1,bi-fi-1).stripWhiteSpace(); a->array = g_curArgTypeName.right(l-bi); } else @@ -294,7 +294,7 @@ ID [a-z_A-Z][a-z_A-Z0-9]* else if (i>=0 && g_curArgTypeName.at(i)!=':') { // type contains a name a->type = removeRedundantWhiteSpace(g_curArgTypeName.left(i+1)); - a->name = g_curArgTypeName.right(l-i-1); + a->name = g_curArgTypeName.right(l-i-1).stripWhiteSpace(); } else // assume only the type was specified, try to determine name later { diff --git a/src/dirdef.cpp b/src/dirdef.cpp index 66ab173..6e192af 100644 --- a/src/dirdef.cpp +++ b/src/dirdef.cpp @@ -127,6 +127,14 @@ void DirDef::writeDocumentation(OutputList &ol) ol.popGeneratorState(); } + if (!Config_getString("GENERATE_TAGFILE").isEmpty()) + { + Doxygen::tagFile << " <compound kind=\"dir\">" << endl; + Doxygen::tagFile << " <name>" << convertToXML(displayName()) << "</name>" << endl; + Doxygen::tagFile << " <path>" << convertToXML(name()) << "</path>" << endl; + Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl; + } + ol.startMemberSections(); // write subdir list @@ -144,6 +152,10 @@ void DirDef::writeDocumentation(OutputList &ol) ol.insertMemberAlign(); ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),0,dd->shortName()); ol.endMemberItem(); + if (!Config_getString("GENERATE_TAGFILE").isEmpty()) + { + Doxygen::tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>" << endl; + } if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { ol.startMemberDescription(); @@ -156,7 +168,6 @@ void DirDef::writeDocumentation(OutputList &ol) ol.endMemberList(); } - // write file list if (m_fileList->count()>0) @@ -169,13 +180,22 @@ void DirDef::writeDocumentation(OutputList &ol) while (fd) { ol.startMemberItem(0); - ol.docify("file "); + ol.docify(theTranslator->trFile(FALSE,TRUE)+" "); ol.insertMemberAlign(); - ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name()); - //if (!Config_getString("GENERATE_TAGFILE").isEmpty()) - //{ - // Doxygen::tagFile << " <file>" << convertToXML(fd->name()) << "</file>" << endl; - //} + if (fd->isLinkable()) + { + ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name()); + } + else + { + ol.startBold(); + ol.writeString(fd->name()); + ol.endBold(); + } + if (!Config_getString("GENERATE_TAGFILE").isEmpty()) + { + Doxygen::tagFile << " <file>" << convertToXML(fd->name()) << "</file>" << endl; + } ol.endMemberItem(); if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) { @@ -190,13 +210,17 @@ void DirDef::writeDocumentation(OutputList &ol) } ol.endMemberSections(); - if (!Config_getBool("DETAILS_AT_TOP")) + if (!Config_getString("GENERATE_TAGFILE").isEmpty()) { - writeDetailedDocumentation(ol); + writeDocAnchorsToTagFile(); + Doxygen::tagFile << " </compound>" << endl; } - // write details (if !DETAILS_AT_TOP) + if (!Config_getBool("DETAILS_AT_TOP")) + { + writeDetailedDocumentation(ol); + } endFile(ol); ol.popGeneratorState(); @@ -293,7 +317,7 @@ void buildDirectories() for (;(fd=fni.current());++fni) { //printf("buildDirectories %s\n",fd->name().data()); - if (fd->getReference().isEmpty()) + if (fd->getReference().isEmpty() && !fd->isDocumentationFile()) { DirDef *dir; if ((dir=Doxygen::directories.find(fd->getPath()))==0) // new directory diff --git a/src/dirdef.h b/src/dirdef.h index 0f24646..90ede70 100644 --- a/src/dirdef.h +++ b/src/dirdef.h @@ -32,7 +32,7 @@ class OutputList; class DirDef; -class DirDefList : public QList<DirDef> +class DirList : public QList<DirDef> { public: int compareItems(GCI item1,GCI item2); @@ -67,7 +67,7 @@ class DirDef : public Definition static DirDef *createNewDir(const char *path); static bool matchPath(const QCString &path,QStrList &l); - DirDefList m_subdirs; + DirList m_subdirs; QCString m_dispName; QCString m_shortName; FileList *m_fileList; // list of files in the group @@ -75,7 +75,7 @@ class DirDef : public Definition int m_dirCount; }; -inline int DirDefList::compareItems(GCI item1,GCI item2) +inline int DirList::compareItems(GCI item1,GCI item2) { return stricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName()); } diff --git a/src/dot.cpp b/src/dot.cpp index 4b9f11b..670911e 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -33,6 +33,10 @@ #include <qtextstream.h> #include <md5.h> +// Enable this for transparent images +// It doesn't seems to work very well with edge labels so I disabled it. +//#define DOT_TRANSPARENT + //-------------------------------------------------------------------- static const int maxCmdLine = 40960; @@ -68,6 +72,9 @@ static void writeGraphHeader(QTextStream &t) { t << "digraph G" << endl; t << "{" << endl; +#if defined(DOT_TRANSPARENT) + t << " bgcolor=\"transparent\"" << endl; +#endif t << " edge [fontname=\"Helvetica\",fontsize=10," "labelfontname=\"Helvetica\",labelfontsize=10];\n"; t << " node [fontname=\"Helvetica\",fontsize=10,shape=record];\n"; @@ -586,7 +593,11 @@ void DotNode::writeBox(QTextStream &t, } else { +#if defined(DOT_TRANSPARENT) + t << ",color=\"" << labCol << "\", fillcolor=\"white\", style=\"filled\""; +#else t << ",color=\"" << labCol << "\""; +#endif if (!m_url.isEmpty()) { int anchorPos = m_url.findRev('#'); @@ -2327,8 +2338,30 @@ bool DotCallGraph::isTrivial() const //------------------------------------------------------------- -DotDirDeps::DotDirDeps(DirDef *) +DotDirDeps::DotDirDeps(DirDef *dd) { + FileList *fl = dd->getFiles(); + if (fl) + { + QListIterator<FileDef> fli(*fl); + FileDef *fd; + for (fli.toFirst();(fd=fli.current());++fli) // foreach file in dir dd + { + QList<IncludeInfo> *ifl = fd->includeFileList(); + if (ifl) + { + QListIterator<IncludeInfo> ifli(*ifl); + IncludeInfo *ii; + for (ifli.toFirst();(ii=ifli.current());++ifli) // foreach include file + { + if (ii->fileDef) + { + // add dependency + } + } + } + } + } } DotDirDeps::~DotDirDeps() diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 588f401..6419935 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -4621,6 +4621,7 @@ static void findMember(Entry *root, if (!namespaceName.isEmpty()) nd=getResolvedNamespace(namespaceName); ClassDef *tcd=findClassDefinition(fd,nd,scopeName); + //printf("*** cd=%s tcd=%s fd=%s\n",cd->name().data(),tcd->name().data(),fd->name().data()); if (cd && tcd==cd) // member's classes match { @@ -4859,7 +4860,7 @@ static void findMember(Entry *root, } } } - else // member specialization + else if (cd) // member specialization { MemberDef::MemberType mtype=MemberDef::Function; ArgumentList *tArgList = new ArgumentList; @@ -4894,6 +4895,11 @@ static void findMember(Entry *root, cd->insertMember(md); md->setRefItems(root->sli); } + else + { + //printf("Specialized member %s of unknown scope %s%s found!\n", + // scopeName.data(),funcName.data(),funcArgs.data()); + } } else if (overloaded) // check if the function belongs to only one class { @@ -6496,6 +6502,7 @@ static void findDirDocumentation(Entry *root) //printf("Match for with dir %s\n",matchingDir->name().data()); matchingDir->setBriefDescription(root->brief,root->briefFile,root->briefLine); matchingDir->setDocumentation(root->doc,root->docFile,root->docLine); + addDirToGroups(root,matchingDir); } else { @@ -8284,14 +8291,14 @@ void parseInput() msg("Freeing input...\n"); input.resize(0); - msg("Building directory list...\n"); - buildDirectories(); - findDirDocumentation(root); - msg("Building group list...\n"); buildGroupList(root); organizeSubGroups(root); + msg("Building directory list...\n"); + buildDirectories(); + findDirDocumentation(root); + msg("Building namespace list...\n"); buildNamespaceList(root); findUsingDirectives(root); diff --git a/src/filedef.cpp b/src/filedef.cpp index fbadd59..32c0a5f 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -1110,4 +1110,9 @@ void FileDef::combineUsingRelations() } } - +bool FileDef::isDocumentationFile() const +{ + return name().right(4)==".doc" || + name().right(4)==".txt" || + name().right(4)==".dox"; +} diff --git a/src/filedef.h b/src/filedef.h index bceb878..2af7f94 100644 --- a/src/filedef.h +++ b/src/filedef.h @@ -156,6 +156,7 @@ class FileDef : public Definition void addIncludedUsingDirectives(); void addListReferences(); + bool isDocumentationFile() const; //void generateXML(QTextStream &t); //void generateXMLSection(QTextStream &t,MemberList *ml,const char *type); diff --git a/src/groupdef.cpp b/src/groupdef.cpp index 5a032c2..7fdcd41 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -43,6 +43,7 @@ GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t, namespaceList = new NamespaceList; pageDict = new PageSDict(257); exampleDict = new PageSDict(257); + dirList = new DirList; allMemberList = new MemberList; allMemberNameInfoSDict = new MemberNameInfoSDict(17); if (refFileName) @@ -86,6 +87,7 @@ GroupDef::~GroupDef() delete allMemberList; delete allMemberNameInfoSDict; delete memberGroupSDict; + delete dirList; } void GroupDef::setGroupTitle( const char *t ) @@ -155,6 +157,14 @@ void GroupDef::addNamespace(const NamespaceDef *def) namespaceList->append(def); } +void GroupDef::addDir(const DirDef *def) +{ + if (Config_getBool("SORT_BRIEF_DOCS")) + dirList->inSort(def); + else + dirList->append(def); +} + void GroupDef::addPage(PageDef *def) { //printf("Making page %s part of a group\n",def->name.data()); @@ -516,7 +526,7 @@ void GroupDef::writeDocumentation(OutputList &ol) while (fd) { ol.startMemberItem(0); - ol.docify("file "); + ol.docify(theTranslator->trFile(FALSE,TRUE)+" "); ol.insertMemberAlign(); ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name()); if (!Config_getString("GENERATE_TAGFILE").isEmpty()) @@ -599,6 +609,39 @@ void GroupDef::writeDocumentation(OutputList &ol) ol.endMemberList(); } + // write list of directories + if (dirList->count()>0) + { + ol.startMemberHeader(); + ol.parseText(theTranslator->trDirectories()); + ol.endMemberHeader(); + ol.startMemberList(); + DirDef *dd=dirList->first(); + while (dd) + { + ol.startMemberItem(0); + ol.parseText(theTranslator->trDir(FALSE,TRUE)); + ol.insertMemberAlign(); + ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),0,dd->shortName()); + ol.endMemberItem(); + if (!Config_getString("GENERATE_TAGFILE").isEmpty()) + { + Doxygen::tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>" << endl; + } + if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC")) + { + ol.startMemberDescription(); + ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE); + ol.endMemberDescription(); + ol.newParagraph(); + } + dd=dirList->next(); + } + + ol.endMemberList(); + } + + // write list of classes classSDict->writeDeclaration(ol); @@ -719,6 +762,24 @@ void addNamespaceToGroups(Entry *root,NamespaceDef *nd) } } +void addDirToGroups(Entry *root,DirDef *dd) +{ + //printf("*** root->groups->count()=%d\n",root->groups->count()); + QListIterator<Grouping> gli(*root->groups); + Grouping *g; + for (;(g=gli.current());++gli) + { + GroupDef *gd=0; + //printf("group `%s'\n",g->groupname.data()); + if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname])) + { + gd->addDir(dd); + dd->makePartOfGroup(gd); + //printf("Dir %s: in group %s\n",dd->name().data(),g->groupname.data()); + } + } +} + void addGroupToGroups(Entry *root,GroupDef *subGroup) { QListIterator<Grouping> gli(*root->groups); diff --git a/src/groupdef.h b/src/groupdef.h index 879b2a2..86f4e7a 100644 --- a/src/groupdef.h +++ b/src/groupdef.h @@ -37,6 +37,8 @@ class MemberGroupSDict; class MemberNameInfoSDict; class PageSDict; class PageDef; +class DirDef; +class DirList; class GroupDef : public Definition { @@ -53,8 +55,9 @@ class GroupDef : public Definition void addNamespace(const NamespaceDef *def); void addGroup(const GroupDef *def); void addParentGroup(const GroupDef *def); - void addPage(PageDef *def); // pages in this group - void addExample(const PageDef *def); // examples in this group + void addPage(PageDef *def); + void addExample(const PageDef *def); + void addDir(const DirDef *dd); bool insertMember(MemberDef *def,bool docOnly=FALSE); void removeMember(MemberDef *md); bool containsGroup(const GroupDef *def); // true if def is already a subgroup @@ -108,6 +111,7 @@ class GroupDef : public Definition NamespaceList * getNamespaces() const { return namespaceList; } GroupList * getSubGroups() const { return groupList; } PageSDict * getPages() const { return pageDict; } + DirList * getDirs() const { return dirList; } protected: void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const); @@ -122,6 +126,7 @@ class GroupDef : public Definition GroupList *groupList; // list of sub groups. PageSDict *pageDict; // list of pages in the group PageSDict *exampleDict; // list of examples in the group + DirList *dirList; // list of directories in the group MemberList *allMemberList; MemberNameInfoSDict *allMemberNameInfoSDict; @@ -153,6 +158,7 @@ void addGroupToGroups(Entry *root,GroupDef *subGroup); void addMemberToGroups(Entry *root,MemberDef *md); void addPageToGroups(Entry *root,PageDef *pd); void addExampleToGroups(Entry *root,PageDef *eg); +void addDirToGroups(Entry *root,DirDef *dd); #endif diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index dac75a1..53e2520 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -1375,13 +1375,6 @@ static void writeDefaultQuickLinks(QTextStream &t,bool compact, t << fixSpaces(theTranslator->trModules()); endQuickIndexItem(t); } - if (Config_getBool("SHOW_DIRECTORIES") && documentedDirs>0) - { - startQuickIndexItem(t,"dirs"+Doxygen::htmlFileExtension, - hli==HLI_Directories,compact,first,relPath); - t << fixSpaces(theTranslator->trDirectories()); - endQuickIndexItem(t); - } if (documentedNamespaces>0) { startQuickIndexItem(t,"namespaces"+Doxygen::htmlFileExtension, @@ -1417,6 +1410,13 @@ static void writeDefaultQuickLinks(QTextStream &t,bool compact, t << fixSpaces(theTranslator->trCompoundList()); endQuickIndexItem(t); } + if (Config_getBool("SHOW_DIRECTORIES") && documentedDirs>0) + { + startQuickIndexItem(t,"dirs"+Doxygen::htmlFileExtension, + hli==HLI_Directories,compact,first,relPath); + t << fixSpaces(theTranslator->trDirectories()); + endQuickIndexItem(t); + } if (documentedHtmlFiles>0) { startQuickIndexItem(t,"files"+Doxygen::htmlFileExtension, diff --git a/src/index.cpp b/src/index.cpp index 307ec64..d4d2fc4 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -696,13 +696,6 @@ void writeGraphicalClassHierarchy(OutputList &ol) //---------------------------------------------------------------------------- -static bool nameIsOk(FileDef *fd) -{ - return fd->name().right(4)!=".doc" && - fd->name().right(4)!=".txt" && - fd->name().right(4)!=".dox"; -} - void countFiles(int &htmlFiles,int &files) { htmlFiles=0; @@ -717,7 +710,7 @@ void countFiles(int &htmlFiles,int &files) { bool doc = fd->isLinkableInProject(); bool src = fd->generateSourceFile(); - bool nameOk = nameIsOk(fd); + bool nameOk = !fd->isDocumentationFile(); if (nameOk) { if (doc || src) @@ -823,7 +816,7 @@ void writeFileIndex(OutputList &ol) //printf("Found filedef %s\n",fd->name().data()); bool doc = fd->isLinkableInProject(); bool src = fd->generateSourceFile(); - bool nameOk = nameIsOk(fd); + bool nameOk = !fd->isDocumentationFile(); if (nameOk && (doc || src) && !fd->isReference()) { @@ -2870,13 +2863,13 @@ void writeDirTreeNode(OutputList &ol, DirDef *dd,int level) //printf("gd=`%s': pageDict=%d\n",gd->name().data(),gd->pageDict->count()); if (htmlHelp) { - htmlHelp->addContentsItem(isDir,dd->displayName(),dd->getOutputFileBase()); + htmlHelp->addContentsItem(isDir,dd->shortName(),dd->getOutputFileBase()); htmlHelp->incContentsDepth(); } if (ftvHelp) { ftvHelp->addContentsItem(isDir,dd->getReference(),dd->getOutputFileBase(), - 0,dd->displayName()); + 0,dd->shortName()); ftvHelp->incContentsDepth(); } diff --git a/src/memberdef.cpp b/src/memberdef.cpp index 002352c..4d505f4 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -133,16 +133,26 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, while (a) { if (md->isDefine() || first) ol.startParameterType(first,md->isObjCMethod()?"dummy":0); - QRegExp re(")("); - int vp; + QRegExp re(")("),res("(.*\\*"); + int vp=a->type.find(re); + int wp=a->type.find(res); + + // use the following to put the function pointer type before the name + bool hasFuncPtrType=FALSE; + + // or use the following to put the function pointer as it appears in + // the prototype. + // bool hasFuncPtrType=vp!=-1 && wp!=-1 && wp<vp; + if (!a->attrib.isEmpty() && !md->isObjCMethod()) // argument has an IDL attribute { ol.docify(a->attrib+" "); } - if ((vp=a->type.find(re))!=-1) // argument type is a function pointer + if (hasFuncPtrType) // argument type is a function pointer { //printf("a->type=`%s' a->name=`%s'\n",a->type.data(),a->name.data()); QCString n=a->type.left(vp); + if (hasFuncPtrType) n=a->type.left(wp); if (md->isObjCMethod()) { n.prepend("("); n.append(")"); } if (!cName.isEmpty()) n=addTemplateNames(n,cd->name(),cName); linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md->name(),n); @@ -162,9 +172,16 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, ol.endParameterType(); ol.startParameterName(defArgList->count()<2); } + if (hasFuncPtrType) + { + ol.docify(a->type.mid(wp,vp-wp)); + } if (!a->name.isEmpty() || (a->name.isEmpty() && a->type=="...")) // argument has a name { - ol.docify(" "); + if (!hasFuncPtrType); + { + ol.docify(" "); + } ol.disable(OutputGenerator::Man); ol.startEmphasis(); ol.enable(OutputGenerator::Man); @@ -177,8 +194,8 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd, { ol.docify(a->array); } - if (vp!=-1) // write the part of the argument type - // that comes after the name + if (hasFuncPtrType) // write the part of the argument type + // that comes after the name { linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(), md->name(),a->type.right(a->type.length()-vp)); @@ -405,6 +422,7 @@ MemberDef::MemberDef(const char *df,int dl, m_cachedTypedefValue = 0; m_inbodyLine = -1; m_implOnly=FALSE; + groupMember = 0; } /*! Destroys the member definition. */ @@ -1783,6 +1801,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, writeSourceReffedBy(ol,cname); writeInlineCode(ol,cname); + ol.endIndent(); + if ((m_hasCallGraph || Config_getBool("CALL_GRAPH")) && isFunction() && Config_getBool("HAVE_DOT") ) @@ -1800,7 +1820,6 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, } } - ol.endIndent(); // enable LaTeX again //if (Config_getBool("EXTRACT_ALL") && !hasDocs) ol.enable(OutputGenerator::Latex); ol.popGeneratorState(); @@ -1976,6 +1995,8 @@ bool MemberDef::hasOneLineInitializer() const bool MemberDef::hasMultiLineInitializer() const { + //printf("initLines=%d userInitLines=%d maxInitLines=%d\n", + // initLines,userInitLines,maxInitLines); return initLines>0 && ((initLines<maxInitLines && userInitLines==-1) // implicitly enabled || initLines<userInitLines // explicitly enabled @@ -1984,6 +2005,7 @@ bool MemberDef::hasMultiLineInitializer() const void MemberDef::setInitializer(const char *initializer) { + //printf("setInitializer(%s)\n",initializer); init=initializer; int p=init.length()-1; while (p>=0 && isspace((uchar)init.at(p))) p--; diff --git a/src/memberlist.cpp b/src/memberlist.cpp index e9ad1e1..5226660 100644 --- a/src/memberlist.cpp +++ b/src/memberlist.cpp @@ -76,7 +76,8 @@ void MemberList::countDecMembers() m_funcCnt++,m_numDecMembers++; break; case MemberDef::Enumeration: m_enumCnt++,m_numDecMembers++; break; - case MemberDef::EnumValue: m_enumValCnt++,m_numDecMembers++; break; + case MemberDef::EnumValue: //m_enumValCnt++,m_numDecMembers++; + break; case MemberDef::Typedef: m_typeCnt++,m_numDecMembers++; break; case MemberDef::Prototype: m_protoCnt++,m_numDecMembers++; break; case MemberDef::Define: if (Config_getBool("EXTRACT_ALL") || @@ -92,7 +93,7 @@ void MemberList::countDecMembers() } } } - if (memberGroupList /*&& countSubGroups*/) + if (memberGroupList) { MemberGroupListIterator mgli(*memberGroupList); MemberGroup *mg; @@ -309,10 +310,10 @@ void MemberList::writeDeclarations(OutputList &ol, const char *title,const char *subtitle /*, bool inGroup,bool countSubGroups*/) { - //printf("MemberList::writeDeclaration(title=`%s',subtitle=`%s')\n",title,subtitle); //printf("----- writeDeclaration() ----\n"); countDecMembers(); // count member not in group if (numDecMembers()==0) return; + //printf("MemberList::writeDeclaration(title=`%s',subtitle=`%s')=%d\n",title,subtitle,numDecMembers()); if (title) { ol.startMemberHeader(); diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index b11290f..ee4c48b 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -42,6 +42,7 @@ NamespaceDef::NamespaceDef(const char *df,int dl, setReference(lref); memberGroupSDict = new MemberGroupSDict; memberGroupSDict->setAutoDelete(TRUE); + visited=FALSE; } NamespaceDef::~NamespaceDef() @@ -1055,6 +1055,8 @@ static void readIncludeFile(const QCString &inc) FileDef *oldFileDef = g_yyFileDef; int oldLineNr = g_yyLineNr; //printf("Searching for `%s'\n",incFileName.data()); + + // findFile will overwrite g_yyFileDef if found if ((f=findFile(incFileName,localInclude))) // see if the include file can be found { //printf("Found include file!\n"); @@ -1627,7 +1629,6 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) <Include>[^\">\n]+[\">] { g_incName+=yytext; readIncludeFile(g_incName); - BEGIN(Start); } <DefName>{ID}/"(" { diff --git a/src/scanner.l b/src/scanner.l index 09b6b88..3260974 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -197,6 +197,7 @@ static void initParser() autoGroupStack.setAutoDelete(TRUE); lastDefGroup.groupname.resize(0); insideFormula = FALSE; + insideCode=FALSE; } static void initEntry() @@ -843,6 +844,10 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] %% <*>\x06[^\x06]*\x06 { // new file + if (YY_START==Comment) + { + warn(yyFileName,yyLineNr,"File ended in the middle of a comment block! Perhaps a missing \\endcode?"); + } if (memberGroupId!=DOX_NOGROUP) { warn(yyFileName,yyLineNr,"Warning: Missing //@}"); @@ -1661,6 +1666,10 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] unput(';'); BEGIN(FindMembers); } +<FindMembers>"friend"{BN}+("class"|"union"|"struct"){BN}+ { + current->name=yytext; + BEGIN(FindMembers); + } <FindMembers,FindMemberName>{SCOPENAME} { lineCount(); if (insideIDL && yyleng==9 && strcmp(yytext,"cpp_quote")==0) @@ -2112,7 +2121,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] yyLineNr++; } <ReadInitializer>"@\"" { - printf("insideCS=%d\n",insideCS); + //printf("insideCS=%d\n",insideCS); current->initializer+=yytext; if (!insideCS && !insideObjC) { @@ -2273,7 +2282,6 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] current->section = Entry::VARIABLE_SEC ; current->fileName = yyFileName; current->startLine = yyLineNr; - //printf("New variable type=`%s' name=`%s' groupId=%d\n",current->type.data(),current->name.data(),current->mGrpId); current_root->addSubEntry( current ) ; } if ( *yytext == ',') @@ -2962,6 +2970,12 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] <CopyArgCommentLine>. { fullArgString+=*yytext; } <CopyArgComment>\n { fullArgString+=*yytext; yyLineNr++; } <CopyArgComment>. { fullArgString+=*yytext; } +<CopyArgComment>{CMD}("brief"|"short"){B}+ { + warn(yyFileName,yyLineNr, + "Warning: Ignoring %cbrief command inside argument documentation",*yytext + ); + fullArgString+=' '; + } <ReadTempArgs>"<" { *copyArgString+=*yytext; fullArgString+=*yytext; @@ -3103,8 +3117,10 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] BEGIN(SkipCPP); } <FuncQual>"=" { // typically an initialized function pointer - current->args += *yytext; - BEGIN(FuncPtrInit); + //current->args += *yytext; + //BEGIN(FuncPtrInit); + lastInitializerContext=YY_START; + BEGIN(ReadInitializer); } <FuncPtrInit>[{;] { unput(*yytext); @@ -4265,7 +4281,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] current->startLine = yyLineNr; BEGIN( ExampleDocArg1 ); } -<Doc>{B}*{CMD}"details"{B}+ { /* nop */ +<ClassDoc,PageDoc,Doc,JavaDoc>{B}*{CMD}"details"{B}+ { /* nop */ } <LineDoc>{CMD}"name"[^\n]*\n { lastDefGroup.groupname.resize(0); @@ -5988,6 +6004,10 @@ void parseMain(Entry *rt) scanYYrestart( scanYYin ); BEGIN( FindMembers ); scanYYlex(); + if (YY_START==Comment) + { + warn(yyFileName,yyLineNr,"File ended in the middle of a comment block! Perhaps a missing \\endcode?"); + } forceEndGroup(); diff --git a/src/search_php.h b/src/search_php.h index 337662c..ffd152a 100644 --- a/src/search_php.h +++ b/src/search_php.h @@ -1,4 +1,3 @@ -"<?\n" "function readInt($file)\n" "{\n" " $b1 = ord(fgetc($file)); $b2 = ord(fgetc($file));\n" diff --git a/src/tagreader.cpp b/src/tagreader.cpp index 5716cc9..b629373 100644 --- a/src/tagreader.cpp +++ b/src/tagreader.cpp @@ -132,6 +132,7 @@ class TagGroupInfo QStringList namespaceList; QStringList fileList; QStringList pageList; + QStringList dirList; }; /*! Container for page specific info that can be read from a tagfile */ @@ -144,6 +145,17 @@ class TagPageInfo QStrList docAnchors; }; +/*! Container for directory specific info that can be read from a tagfile */ +class TagDirInfo +{ + public: + QString name; + QString filename; + QString path; + QStringList subdirList; + QStringList fileList; + QStrList docAnchors; +}; /*! Tag file parser. * Reads an XML-structured tagfile and builds up the structure in @@ -160,6 +172,7 @@ class TagFileParser : public QXmlDefaultHandler InPage, InMember, InPackage, + InDir, InTempArgList }; class StartElementHandler @@ -264,6 +277,11 @@ class TagFileParser : public QXmlDefaultHandler m_curPackage = new TagPackageInfo; m_state = InPackage; } + else if (kind=="dir") + { + m_curDir = new TagDirInfo; + m_state = InDir; + } else { err("Error: Unknown compound attribute `%s' found!\n",kind.data()); @@ -287,6 +305,8 @@ class TagFileParser : public QXmlDefaultHandler m_curGroup=0; break; case InPage: m_tagFilePages.append(m_curPage); m_curPage=0; break; + case InDir: m_tagFileDirs.append(m_curDir); + m_curDir=0; break; case InPackage: m_tagFilePackages.append(m_curPackage); m_curPackage=0; break; default: @@ -351,6 +371,7 @@ class TagFileParser : public QXmlDefaultHandler case InPage: m_curPage->docAnchors.append(m_curString); break; case InMember: m_curMember->docAnchors.append(m_curString); break; case InPackage: m_curPackage->docAnchors.append(m_curString); break; + case InDir: m_curDir->docAnchors.append(m_curString); break; default: err("Error: Unexpected tag `member' found\n"); break; } } @@ -379,6 +400,7 @@ class TagFileParser : public QXmlDefaultHandler switch(m_state) { case InGroup: m_curGroup->fileList.append(m_curString); break; + case InDir: m_curDir->fileList.append(m_curString); break; default: err("Error: Unexpected tag `file' found\n"); break; } } @@ -390,6 +412,14 @@ class TagFileParser : public QXmlDefaultHandler default: err("Error: Unexpected tag `page' found\n"); break; } } + void endDir() + { + switch(m_state) + { + case InDir: m_curDir->subdirList.append(m_curString); break; + default: err("Error: Unexpected tag `page' found\n"); break; + } + } void startStringValue(const QXmlAttributes& ) { m_curString = ""; @@ -414,6 +444,7 @@ class TagFileParser : public QXmlDefaultHandler case InNamespace: m_curNamespace->name = m_curString; break; case InGroup: m_curGroup->name = m_curString; break; case InPage: m_curPage->name = m_curString; break; + case InDir: m_curDir->name = m_curString; break; case InMember: m_curMember->name = m_curString; break; case InPackage: m_curPackage->name = m_curString; break; default: err("Error: Unexpected tag `name' found\n"); break; @@ -510,6 +541,7 @@ class TagFileParser : public QXmlDefaultHandler case InGroup: m_curGroup->filename = m_curString; break; case InPage: m_curPage->filename = m_curString; break; case InPackage: m_curPackage->filename = m_curString; break; + case InDir: m_curDir->filename = m_curString; break; default: err("Error: Unexpected tag `filename' found\n"); break; } } @@ -518,6 +550,7 @@ class TagFileParser : public QXmlDefaultHandler switch (m_state) { case InFile: m_curFile->path = m_curString; break; + case InDir: m_curDir->path = m_curString; break; default: err("Error: Unexpected tag `path' found\n"); break; } } @@ -580,6 +613,7 @@ class TagFileParser : public QXmlDefaultHandler m_curGroup=0; m_curPage=0; m_curPackage=0; + m_curDir=0; m_stateStack.setAutoDelete(TRUE); m_tagFileClasses.setAutoDelete(TRUE); @@ -588,6 +622,7 @@ class TagFileParser : public QXmlDefaultHandler m_tagFileGroups.setAutoDelete(TRUE); m_tagFilePages.setAutoDelete(TRUE); m_tagFilePackages.setAutoDelete(TRUE); + m_tagFileDirs.setAutoDelete(TRUE); m_startElementHandlers.insert("compound", new StartElementHandler(this,&TagFileParser::startCompound)); m_startElementHandlers.insert("member", new StartElementHandler(this,&TagFileParser::startMember)); @@ -603,6 +638,7 @@ class TagFileParser : public QXmlDefaultHandler m_startElementHandlers.insert("class", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("namespace", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("file", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("dir", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("page", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("docanchor", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("tagfile", new StartElementHandler(this,&TagFileParser::startIgnoreElement)); @@ -623,6 +659,7 @@ class TagFileParser : public QXmlDefaultHandler m_endElementHandlers.insert("class" , new EndElementHandler(this,&TagFileParser::endClass)); m_endElementHandlers.insert("namespace", new EndElementHandler(this,&TagFileParser::endNamespace)); m_endElementHandlers.insert("file", new EndElementHandler(this,&TagFileParser::endFile)); + m_endElementHandlers.insert("dir", new EndElementHandler(this,&TagFileParser::endDir)); m_endElementHandlers.insert("page", new EndElementHandler(this,&TagFileParser::endPage)); m_endElementHandlers.insert("docanchor", new EndElementHandler(this,&TagFileParser::endDocAnchor)); m_endElementHandlers.insert("tagfile", new EndElementHandler(this,&TagFileParser::endIgnoreElement)); @@ -678,6 +715,7 @@ class TagFileParser : public QXmlDefaultHandler QList<TagGroupInfo> m_tagFileGroups; QList<TagPageInfo> m_tagFilePages; QList<TagPackageInfo> m_tagFilePackages; + QList<TagDirInfo> m_tagFileDirs; QDict<StartElementHandler> m_startElementHandlers; QDict<EndElementHandler> m_endElementHandlers; TagClassInfo *m_curClass; @@ -686,6 +724,7 @@ class TagFileParser : public QXmlDefaultHandler TagPackageInfo *m_curPackage; TagGroupInfo *m_curGroup; TagPageInfo *m_curPage; + TagDirInfo *m_curDir; TagMemberInfo *m_curMember; TagIncludeInfo *m_curIncludes; QCString m_curString; @@ -872,6 +911,25 @@ void TagFileParser::dump() msg(" title `%s'\n",pd->title.data()); msg(" filename `%s'\n",pd->filename.data()); } + //============== DIRS + QListIterator<TagDirInfo> ldi(m_tagFileDirs); + TagDirInfo *dd; + for (;(dd=ldi.current());++ldi) + { + msg("dir `%s'\n",dd->name.data()); + msg(" path `%s'\n",dd->path.data()); + QStringList::Iterator it; + for ( it = dd->fileList.begin(); + it != dd->fileList.end(); ++it ) + { + msg( " file: %s \n", (*it).latin1() ); + } + for ( it = dd->subdirList.begin(); + it != dd->subdirList.end(); ++it ) + { + msg( " subdir: %s \n", (*it).latin1() ); + } + } } void TagFileParser::addDocAnchors(Entry *e,QStrList &l) diff --git a/src/translator_cn.h b/src/translator_cn.h index def8228..7cefc71 100644 --- a/src/translator_cn.h +++ b/src/translator_cn.h @@ -24,7 +24,7 @@ */ #define CN_SPC -class TranslatorChinese : public TranslatorAdapter_1_3_9 +class TranslatorChinese : public Translator { public: /*! Used for identification of the language. The identification @@ -1482,6 +1482,69 @@ class TranslatorChinese : public TranslatorAdapter_1_3_9 /* return filename + " Source File"; */ return filename + CN_SPC"Ô´Îļþ"; } +////////////////////////////////////////////////////////////////////////// +// new since 1.3.9 +////////////////////////////////////////////////////////////////////////// + + /*! This is used as the name of the chapter containing the directory + * hierarchy. + */ + virtual QCString trDirIndex() + /* { return "Directory Hierarchy"; } */ + { + return "$(BL\\¼½á$(DC((B"; + } + + /*! This is used as the name of the chapter containing the documentation + * of the directories. + */ + virtual QCString trDirDocumentation() + /* { return "Directory Documentation"; } */ + { + return "$(BL\\¼J8[c(B"; + } + + /*! This is used as the title of the directory index and also in the + * Quick links of a HTML page, to link to the directory hierarchy. + */ + virtual QCString trDirectories() + /* { return "Directories"; } */ + { + return "$(BL\\¼(B"; + } + + /*! This returns a sentences that introduces the directory hierarchy. + * and the fact that it is sorted alphabetically per level + */ + virtual QCString trDirDescription() +/* { return "This directory hierarchy is sorted roughly, " */ +/* "but not completely, alphabetically:"; */ +/* } */ + { + return "$(BL\\¼½á$(DC(½ö¾¹ý$(BBgCWE*GSNs!$VuL$40A40D;zJl˳=x(B"; + } + + /*! This returns the title of a directory page. The name of the + * directory is passed via \a dirName. + */ + virtual QCString trDirReference(const char *dirName) + /* { QCString result=dirName; result+=" Directory Reference"; return result; } */ + { + QCString result=dirName; + result+=CN_SPC"$(BL\\¼;29M(B"; + return result; + } + + /*! This returns the word directory with or without starting capital + * (\a first_capital) and in sigular or plural form (\a singular). + */ + virtual QCString trDir(bool, bool) + { + /* QCString result((first_capital ? "Director" : "director")); */ + /* if (singular) result+="y"; else result+="ies"; */ + /* return result; */ + return "$(BL\\¼(B"; + } }; diff --git a/src/translator_cz.h b/src/translator_cz.h index 79f0945..f48a32c 100644 --- a/src/translator_cz.h +++ b/src/translator_cz.h @@ -130,6 +130,7 @@ // 2004/02/26 - trLegendDocs() updated. // 2004/02/27 - Text inside the trCallGraph() corrected. // 2004/06/16 - The new method "since 1.3.8" implemented. +// 2004/09/14 - The new methods "since 1.3.9" implemented. // Todo // ---- @@ -149,7 +150,7 @@ // Windows version. The version which does not call the function is // probably slightly faster. -class TranslatorCzech : public TranslatorAdapter_1_3_9 +class TranslatorCzech : public Translator { private: /*! The decode() inline assumes the source written in the @@ -1673,6 +1674,59 @@ class TranslatorCzech : public TranslatorAdapter_1_3_9 return decode("Zdrojový soubor ") + filename; } + +////////////////////////////////////////////////////////////////////////// +// new since 1.3.9 +////////////////////////////////////////////////////////////////////////// + + + /*! This is used as the name of the chapter containing the directory + * hierarchy. + */ + virtual QCString trDirIndex() + { return decode("Hierarchie adresáøù"); } + + /*! This is used as the name of the chapter containing the documentation + * of the directories. + */ + virtual QCString trDirDocumentation() + { return decode("Dokumentace k adresáøùm"); } + + /*! This is used as the title of the directory index and also in the + * Quick links of a HTML page, to link to the directory hierarchy. + */ + virtual QCString trDirectories() + { return decode("Adresáøe"); } + + /*! This returns a sentences that introduces the directory hierarchy. + * and the fact that it is sorted alphabetically per level + */ + virtual QCString trDirDescription() + { + return decode("Následující hierarchie adresáøù je zhruba, " + "ale ne úplnì, øazena podle abecedy:"); + } + + /*! This returns the title of a directory page. The name of the + * directory is passed via \a dirName. + */ + virtual QCString trDirReference(const char *dirName) + { + QCString result = "Reference k adresáøi "; + result += dirName; + return decode(result); + } + + /*! This returns the word directory with or without starting capital + * (\a first_capital) and in sigular or plural form (\a singular). + */ + virtual QCString trDir(bool first_capital, bool singular) + { + QCString result((first_capital ? "Adresáø" : "adresáø")); + if ( ! singular) + result += "e"; + return decode(result); + } }; #endif // TRANSLATOR_CZ_H diff --git a/src/translator_de.h b/src/translator_de.h index 1f7d995..20b7ffe 100644 --- a/src/translator_de.h +++ b/src/translator_de.h @@ -87,13 +87,22 @@ // 2004/08/01 Jens Seidel (jensseidel@users.sourceforge.net) // - Updated for "new since 1.3.8" version // +// 2004/09/19 Jens Seidel (jensseidel@users.sourceforge.net) +// - Updated for "new since 1.3.9" version +// +// 2004/09/25 Jens Seidel (jensseidel@users.sourceforge.net) +// - changed "Typendefinitionen" to "Typdefinitionen" in +// trFileMembersDescription() and trTypedefs() +// - added a dash after (file, ...) names and in front of description +// - changed "Eigenschaften" to "Propertys" (yeah, not ..."ies") +// // Todo: // - see FIXME #ifndef TRANSLATOR_DE_H #define TRANSLATOR_DE_H -class TranslatorGerman : public TranslatorAdapter_1_3_9 +class TranslatorGerman : public Translator { public: @@ -341,7 +350,7 @@ class TranslatorGerman : public TranslatorAdapter_1_3_9 if (!extractAll) result+="dokumentierten "; if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) { - result+="Funktionen, Variablen, Makros, Aufzählungen und Typendefinitionen"; + result+="Funktionen, Variablen, Makros, Aufzählungen und Typdefinitionen"; } else { @@ -471,7 +480,7 @@ class TranslatorGerman : public TranslatorAdapter_1_3_9 * list of typedefs */ virtual QCString trTypedefs() - { return "Typendefinitionen"; } + { return "Typdefinitionen"; } /*! This is used in the documentation of a file as a header before the * list of enumerations @@ -685,7 +694,7 @@ class TranslatorGerman : public TranslatorAdapter_1_3_9 virtual QCString trFileReference(const char *fileName) { QCString result=fileName; - result+=" Dateireferenz"; + result+="-Dateireferenz"; return result; } @@ -693,7 +702,7 @@ class TranslatorGerman : public TranslatorAdapter_1_3_9 virtual QCString trNamespaceReference(const char *namespaceName) { QCString result=namespaceName; - result+=" Namensbereichsreferenz"; + result+="-Namensbereichsreferenz"; return result; } @@ -1214,13 +1223,13 @@ class TranslatorGerman : public TranslatorAdapter_1_3_9 /*! Used as a section header for IDL properties */ virtual QCString trProperties() { - return "Eigenschaften"; + return "Propertys"; } /*! Used as a section header for IDL property documentation */ virtual QCString trPropertyDocumentation() { - return "Dokumentation der Eigenschaften"; + return "Dokumentation der Propertys"; } ////////////////////////////////////////////////////////////////////////// @@ -1619,6 +1628,52 @@ class TranslatorGerman : public TranslatorAdapter_1_3_9 return filename + " Quellcode"; } +////////////////////////////////////////////////////////////////////////// +// new since 1.3.9 +////////////////////////////////////////////////////////////////////////// + + /*! This is used as the name of the chapter containing the directory + * hierarchy. + */ + virtual QCString trDirIndex() + { return "Verzeichnishierarchie"; } + + /*! This is used as the name of the chapter containing the documentation + * of the directories. + */ + virtual QCString trDirDocumentation() + { return "Verzeichnisdokumentation"; } + + /*! This is used as the title of the directory index and also in the + * Quick links of a HTML page, to link to the directory hierarchy. + */ + virtual QCString trDirectories() + { return "Verzeichnisse"; } + + /*! This returns a sentences that introduces the directory hierarchy. + * and the fact that it is sorted alphabetically per level + */ + virtual QCString trDirDescription() + { return "Diese Verzeichnishierarchie ist -mit Einschränkungen- " + "alphabetisch sortiert:"; + } + + /*! This returns the title of a directory page. The name of the + * directory is passed via \a dirName. + */ + virtual QCString trDirReference(const char *dirName) + { QCString result=dirName; result+=" Verzeichnisreferenz"; return result; } + + /*! This returns the word directory with or without starting capital + * (\a first_capital) and in sigular or plural form (\a singular). + */ + virtual QCString trDir(bool, bool singular) + { + QCString result("Verzeichnis"); + if (!singular) result+="se"; + return result; + } + }; #endif diff --git a/src/translator_es.h b/src/translator_es.h index 06bb493..d6f4b48 100644 --- a/src/translator_es.h +++ b/src/translator_es.h @@ -359,7 +359,7 @@ class TranslatorSpanish : public TranslatorAdapter_1_3_8 * for the author section in man pages. */ virtual QCString trAuthor(bool first_capital, bool singular) { - QCString result((first_capital ? "Author" : "author")); + QCString result((first_capital ? "Autor" : "autor")); if (!singular) result+="s"; return result; } diff --git a/src/translator_hr.h b/src/translator_hr.h index 0227f4f..ae2be0c 100644 --- a/src/translator_hr.h +++ b/src/translator_hr.h @@ -55,11 +55,14 @@ // // 2004/06/21 // - Added strings for 1.3.8 +// +// 2004/09/15 +// - Added strings for 1.3.9 #ifndef TRANSLATOR_HR_H #define TRANSLATOR_HR_H -class TranslatorCroatian : public TranslatorAdapter_1_3_9 +class TranslatorCroatian : public Translator { private: /*! to avoid macro redefinition from translator_cz.h */ @@ -1226,6 +1229,51 @@ class TranslatorCroatian : public TranslatorAdapter_1_3_9 return "Izvorni kod datoteke " + filename; } +////////////////////////////////////////////////////////////////////////// +// new since 1.3.9 +////////////////////////////////////////////////////////////////////////// + + /*! This is used as the name of the chapter containing the directory + * hierarchy. + */ + virtual QCString trDirIndex() + { return "Stablo direktorija"; } + + /*! This is used as the name of the chapter containing the documentation + * of the directories. + */ + virtual QCString trDirDocumentation() + { return "Dokumentacija direktorija"; } + + /*! This is used as the title of the directory index and also in the + * Quick links of a HTML page, to link to the directory hierarchy. + */ + virtual QCString trDirectories() + { return "Direktoriji"; } + + /*! This returns a sentences that introduces the directory hierarchy. + * and the fact that it is sorted alphabetically per level + */ + virtual QCString trDirDescription() + { return "Stablo direktorija sortirano abecednim redom:"; } + + /*! This returns the title of a directory page. The name of the + * directory is passed via \a dirName. + */ + virtual QCString trDirReference(const char *dirName) + { QCString result= "Opis direktorija "; result += dirName; return result; } + + /*! This returns the word directory with or without starting capital + * (\a first_capital) and in sigular or plural form (\a singular). + */ + virtual QCString trDir(bool first_capital, bool singular) + { + QCString result((first_capital ? "Direktorij" : "direktorij")); + if (!singular) result+="i"; + return result; + } }; #endif + + diff --git a/src/translator_hu.h b/src/translator_hu.h index 77c5b33..477a1d2 100644 --- a/src/translator_hu.h +++ b/src/translator_hu.h @@ -29,7 +29,7 @@ #ifndef TRANSLATOR_HU_H #define TRANSLATOR_HU_H -class TranslatorHungarian : public TranslatorAdapter_1_3_9 +class TranslatorHungarian : public Translator { private: const char * zed(char c) @@ -1526,6 +1526,52 @@ class TranslatorHungarian : public TranslatorAdapter_1_3_9 return filename + " Forrásfájl"; } +////////////////////////////////////////////////////////////////////////// +// new since 1.3.9 +////////////////////////////////////////////////////////////////////////// + + /*! This is used as the name of the chapter containing the directory + * hierarchy. + */ + virtual QCString trDirIndex() + { return "Könyvtárhierarchia"; } + + /*! This is used as the name of the chapter containing the documentation + * of the directories. + */ + virtual QCString trDirDocumentation() + { return "Könyvtárak dokumentációja"; } + + /*! This is used as the title of the directory index and also in the + * Quick links of a HTML page, to link to the directory hierarchy. + */ + virtual QCString trDirectories() + { return "Könyvtárak"; } + + /*! This returns a sentences that introduces the directory hierarchy. + * and the fact that it is sorted alphabetically per level + */ + virtual QCString trDirDescription() + { return "Majdnem (de nem teljesen) betûrendbe szedett " + "könyvtárhierarchia:"; + } + + /*! This returns the title of a directory page. The name of the + * directory is passed via \a dirName. + */ + virtual QCString trDirReference(const char *dirName) + { QCString result=dirName; result+=" könyvtárreferencia"; return result; } + + /*! This returns the word directory with or without starting capital + * (\a first_capital) and in sigular or plural form (\a singular). + */ + virtual QCString trDir(bool first_capital, bool /*singular*/) + { + QCString result((first_capital ? "Könyvtár" : "könyvtár")); + //if (singular) result+="y"; else result+="ies"; + return result; + } + }; #endif diff --git a/src/translator_it.h b/src/translator_it.h index 9e319c6..8159aa8 100644 --- a/src/translator_it.h +++ b/src/translator_it.h @@ -19,6 +19,7 @@ * * Revision history * + * 2004/09: translated new items used since version 1.3.9 * 2004/06: translated new items used since version 1.3.8 * 2003/11: translated new items used since version 1.3.3 * 2003/06: translated new items used since version 1.3.1 @@ -71,7 +72,7 @@ #ifndef TRANSLATOR_IT_H #define TRANSLATOR_IT_H -class TranslatorItalian : public TranslatorAdapter_1_3_9 +class TranslatorItalian : public Translator { public: @@ -1516,6 +1517,51 @@ class TranslatorItalian : public TranslatorAdapter_1_3_9 return " File sorgente " + filename ; } +////////////////////////////////////////////////////////////////////////// +// new since 1.3.9 +////////////////////////////////////////////////////////////////////////// + + /*! This is used as the name of the chapter containing the directory + * hierarchy. + */ + virtual QCString trDirIndex() + { return "Gerarchia delle directory"; } + + /*! This is used as the name of the chapter containing the documentation + * of the directories. + */ + virtual QCString trDirDocumentation() + { return "Documentazione delle directory"; } + + /*! This is used as the title of the directory index and also in the + * Quick links of a HTML page, to link to the directory hierarchy. + */ + virtual QCString trDirectories() + { return "Directory"; } + + /*! This returns a sentences that introduces the directory hierarchy. + * and the fact that it is sorted alphabetically per level + */ + virtual QCString trDirDescription() + { return "Questa gerarchia di directory è ordinata " + "approssimativamente, ma non completamente, in ordine alfabetico:"; + } + + /*! This returns the title of a directory page. The name of the + * directory is passed via \a dirName. + */ + virtual QCString trDirReference(const char *dirName) + { QCString result="Riferimenti per la directory "; result+=dirName; return result; } + + /*! This returns the word directory with or without starting capital + * (\a first_capital) and in sigular or plural form (\a singular). + */ + virtual QCString trDir(bool first_capital, bool) + { + QCString result((first_capital ? "Directory" : "directory")); + return result; + } + }; #endif diff --git a/src/translator_pl.h b/src/translator_pl.h index 3186ead..f8bab5f 100644 --- a/src/translator_pl.h +++ b/src/translator_pl.h @@ -13,14 +13,14 @@ * Documents produced by Doxygen are derivative works derived from the * input used in their production; they are not affected by this license. * - * Polish translation was updated to version 1.3.8 by + * Polish translation was updated to version 1.3.9 by * Piotr Kaminski (Piotr.Kaminski@ctm.gdynia.pl) */ #ifndef TRANSLATOR_PL_H #define TRANSLATOR_PL_H -class TranslatorPolish : public TranslatorAdapter_1_3_9 +class TranslatorPolish : public Translator { private: /*! to avoid macro redefinition from translator_pl.h */ @@ -1511,7 +1511,51 @@ class TranslatorPolish : public TranslatorAdapter_1_3_9 return "Plik ¼ród³owy " + filename; } +////////////////////////////////////////////////////////////////////////// +// new since 1.3.9 +////////////////////////////////////////////////////////////////////////// + /*! This is used as the name of the chapter containing the directory + * hierarchy. + */ + virtual QCString trDirIndex() + { return "Struktura katalogów"; } + + /*! This is used as the name of the chapter containing the documentation + * of the directories. + */ + virtual QCString trDirDocumentation() + { return "Dokumentacja katalogów"; } + + /*! This is used as the title of the directory index and also in the + * Quick links of a HTML page, to link to the directory hierarchy. + */ + virtual QCString trDirectories() + { return "Katalogi"; } + + /*! This returns a sentences that introduces the directory hierarchy. + * and the fact that it is sorted alphabetically per level + */ + virtual QCString trDirDescription() + { return "Ta struktura katalogów jest posortowana jest z grubsza, " + "choæ nie ca³kowicie, alfabetycznie:"; + } + + /*! This returns the title of a directory page. The name of the + * directory is passed via \a dirName. + */ + virtual QCString trDirReference(const char *dirName) + { QCString result="Dokumentacja katalogu "; result+=dirName; return result; } + + /*! This returns the word directory with or without starting capital + * (\a first_capital) and in sigular or plural form (\a singular). + */ + virtual QCString trDir(bool first_capital, bool singular) + { + QCString result((first_capital ? "Katalog" : "katalog")); + if (! singular) result+="i"; + return result; + } }; #endif diff --git a/src/translator_ru.h b/src/translator_ru.h index 4a40459..b431953 100644 --- a/src/translator_ru.h +++ b/src/translator_ru.h @@ -18,7 +18,7 @@ * * Nickolay Semyonov * Andrey V. Stolyarov released Feb 14, 2001 - * Alexandr V. Chelpanov <cav@cryptopro.ru> released Jun 16, 2004 + * Alexandr V. Chelpanov <cav@cryptopro.ru> released Sep 25, 2004 * * ðÒÉ ÐÅÒÅ×ÏÄÅ ÚÁÇÏÌÏ×ËÏ× ÓÌÏ×Á list É documentation ÕÂÒÁÎÙ. * @@ -49,7 +49,7 @@ #ifndef TRANSLATOR_RU_H #define TRANSLATOR_RU_H -class TranslatorRussian : public TranslatorAdapter_1_3_9 +class TranslatorRussian : public Translator { private: /*! The Decode() inline assumes the source written in the @@ -1570,7 +1570,51 @@ class TranslatorRussian : public TranslatorAdapter_1_3_9 */ virtual QCString trSourceFile(QCString& filename) { - return "éÓÈÏÄÎÙÊ ÆÁÊÌ " + filename; + return decode( "éÓÈÏÄÎÙÊ ÆÁÊÌ " + filename ); + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.3.9 +////////////////////////////////////////////////////////////////////////// + + /*! This is used as the name of the chapter containing the directory + * hierarchy. + */ + virtual QCString trDirIndex() + { return decode( "äÅÒÅ×Ï ÄÉÒÅËÔÏÒÉÊ" ); } + + /*! This is used as the name of the chapter containing the documentation + * of the directories. + */ + virtual QCString trDirDocumentation() + { return decode( "äÉÒÅËÔÏÒÉÉ" ); } + + /*! This is used as the title of the directory index and also in the + * Quick links of a HTML page, to link to the directory hierarchy. + */ + virtual QCString trDirectories() + { return decode( "áÌÆÁ×ÉÔÎÙÊ ÕËÁÚÁÔÅÌØ ÄÉÒÅËÔÏÒÉÊ" ); } + + /*! This returns a sentences that introduces the directory hierarchy. + * and the fact that it is sorted alphabetically per level + */ + virtual QCString trDirDescription() + { return decode( "äÅÒÅ×Ï ÄÉÒÅËÔÏÒÉÊ" ); } + + /*! This returns the title of a directory page. The name of the + * directory is passed via \a dirName. + */ + virtual QCString trDirReference(const char *dirName) + { QCString result=QCString("óÏÄÅÒÖÁÎÉÅ ÄÉÒÅËÔÏÒÉÉ ")+ dirName; return decode( result ); } + + /*! This returns the word directory with or without starting capital + * (\a first_capital) and in sigular or plural form (\a singular). + */ + virtual QCString trDir(bool first_capital, bool singular) + { + QCString result((first_capital ? "äÉÒÅËÔÏÒÉ" : "ÄÉÒÅËÔÏÒÉ")); + if (singular) result+="Ñ"; else result+="É"; + return decode( result ); } }; diff --git a/src/translator_se.h b/src/translator_se.h index 0d3866f..1307b90 100644 --- a/src/translator_se.h +++ b/src/translator_se.h @@ -69,7 +69,7 @@ Problem! #ifndef TRANSLATOR_SE_H #define TRANSLATOR_SE_H -class TranslatorSwedish : public TranslatorAdapter_1_3_8 +class TranslatorSwedish : public Translator { public: @@ -1401,6 +1401,65 @@ class TranslatorSwedish : public TranslatorAdapter_1_3_8 return "Träffar:"; } +////////////////////////////////////////////////////////////////////////// +// new since 1.3.8 +////////////////////////////////////////////////////////////////////////// + + /*! This is used in HTML as the title of page with source code for file filename + */ + virtual QCString trSourceFile(QCString& filename) + { + return "Källkodsfilen " + filename; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.3.9 +////////////////////////////////////////////////////////////////////////// + + /*! This is used as the name of the chapter containing the directory + * hierarchy. + */ + virtual QCString trDirIndex() + { return "Katalogstruktur"; } + + /*! This is used as the name of the chapter containing the documentation + * of the directories. + */ + virtual QCString trDirDocumentation() + { return "Katalogdokumentation"; } + + /*! This is used as the title of the directory index and also in the + * Quick links of a HTML page, to link to the directory hierarchy. + */ + virtual QCString trDirectories() + { return "Kataloger"; } + + /*! This returns a sentences that introduces the directory hierarchy. + * and the fact that it is sorted alphabetically per level + */ + virtual QCString trDirDescription() + { return "Den här katalogen är grovt sorterad, " + "men inte helt, i alfabetisk ordning:"; + } + + /*! This returns the title of a directory page. The name of the + * directory is passed via \a dirName. + */ + virtual QCString trDirReference(const char *dirName) + { QCString result=dirName; result+=" Katalogreferens"; return result; } + + /*! This returns the word directory with or without starting capital + * (\a first_capital) and in sigular or plural form (\a singular). + */ + virtual QCString trDir(bool first_capital, bool singular) + { + QCString result((first_capital ? "Katalog" : "katalog")); + if (!singular) result+="er"; + return result; + } + + + }; #endif diff --git a/src/util.cpp b/src/util.cpp index 1d592d4..fba7edb 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1041,6 +1041,19 @@ ClassDef *getResolvedClassRec(Definition *scope, // scope, the name to search for and the explicit scope prefix. The speedup // achieved by this simple cache can be enormous. QCString key=scope->name()+"+"+name+"+"+explicitScopePart; + // if a file scope is given and it contains using statements we should + // also use the file part in the key (as a class name can be in + // two different namespaces and a using statement in a file can select + // one of them). + if (fileScope && ((fileScope->getUsedNamespaces() && + fileScope->getUsedNamespaces()->count()>0) || + (fileScope->getUsedClasses() && + fileScope->getUsedClasses()->count()>0)) + ) + { + key+="+"+fileScope->name(); + } + LookupInfo *pval=Doxygen::lookupCache.find(key); //printf("Searching for %s result=%p\n",key.data(),pval); if (pval) @@ -1080,6 +1093,7 @@ ClassDef *getResolvedClassRec(Definition *scope, g_visitedNamespaces.clear(); // test accessibility of definition within scope. int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart); + //printf("distance %s is %d\n",d->name().data(),distance); if (distance!=-1) // definition is accessible { // see if we are dealing with a class or a typedef @@ -1092,6 +1106,26 @@ ClassDef *getResolvedClassRec(Definition *scope, bestTypedef = 0; bestTemplSpec.resize(0); } + else if (distance==minDistance && + fileScope && + fileScope->getUsedNamespaces() && + d->getOuterScope()->definitionType()==Definition::TypeNamespace && + bestMatch->getOuterScope()==Doxygen::globalScope + ) + { + // in case the distance is equal it could be that a class X + // is defined in a namespace and in the global scope. When searched + // in the global scope the distance is 0 in both cases. We have + // to choose one of the definitions: we choose the one in the + // namespace if the fileScope imports namespaces and the definition + // found was in a namespace while the best match so far isn't. + // Just a non-perfect heuristic but it could help in some situations + // (kdecore code is an example). + minDistance=distance; + bestMatch = (ClassDef *)d; + bestTypedef = 0; + bestTemplSpec.resize(0); + } } else if (d->definitionType()==Definition::TypeMember) { @@ -1930,7 +1964,7 @@ static QCString trimTemplateSpecifiers( } //printf("result=%s\n",result.data()); - return result; + return result.stripWhiteSpace(); } /*! @@ -2120,6 +2154,36 @@ static void trimNamespaceScope(QCString &t1,QCString &t2,const QCString &nsName) } #endif +static void stripIrrelevantString(QCString &target,const QCString &str) +{ + if (target==str) { target.resize(0); return; } + int i,p=0; + int l=str.length(); + while ((i=target.find(str,p))!=-1) + { + bool isMatch = (i==0 || !isId(target.at(i-1))) && // not a character before str + (i+l==(int)target.length() || !isId(target.at(i+l))); // not a character after str + if (isMatch) + { + int i1=target.find('*',i+l); + int i2=target.find('&',i+l); + if (i1==-1 && i2==-1) + { + // strip str from target at index i + target=target.left(i)+target.right(target.length()-i-l); + i-=l; + } + else if ((i1!=-1 && i<i1) || (i2!=-1 && i<i2)) // str before * or & + { + // move str to front + target=str+" "+target.left(i)+target.right(target.length()-i-l); + i++; + } + } + p = i+l; + } +} + /*! According to the C++ spec and Ivan Vecerina: Parameter declarations that differ only in the presence or absence @@ -2138,53 +2202,8 @@ static void trimNamespaceScope(QCString &t1,QCString &t2,const QCString &nsName) void stripIrrelevantConstVolatile(QCString &s) { //printf("stripIrrelevantConstVolatile(%s)=",s.data()); - int i; - if (s=="const") { s.resize(0); return; } - if (s=="volatile") { s.resize(0); return; } - - // strip occurrences of const - int constLen=5+1; - i = s.find("const "); - if (i==-1 && s.right(5)=="const") { i=s.length()-5;constLen=5; } - while (i!=-1) - { - // no & or * after the const - int i1=s.find('*',i+constLen); - int i2=s.find('&',i+constLen); - if (i1==-1 && i2==-1) - { - s=s.left(i)+s.right(s.length()-i-constLen); - i-=constLen; - } - else if ((i1!=-1 && i<i1) || (i2!=-1 && i<i2)) // const before * or & - { - // move const to front - s=(QCString)"const "+s.left(i)+s.right(s.length()-i-constLen); - } - i = s.find("const ",i+constLen); - } - - // strip occurrences of volatile - int volatileLen=8+1; - i = s.find("volatile "); - if (i==-1 && s.right(8)=="volatile") { i=s.length()-8;constLen=8; } - while (i!=-1) - { - // no & or * after the volatile - int i1=s.find('*',i+volatileLen); - int i2=s.find('&',i+volatileLen); - if (i1==-1 && i2==-1) - { - s=s.left(i)+s.right(s.length()-i-volatileLen); - i-=volatileLen; - } - else if ((i1!=-1 && i<i1) || (i2!=-1 && i<i2)) // volatile before * or & - { - // move volatile to front - s=(QCString)"volatile "+s.left(i)+s.right(s.length()-i-volatileLen); - } - i = s.find("volatile ",i+volatileLen); - } + stripIrrelevantString(s,"const"); + stripIrrelevantString(s,"volatile"); //printf("%s\n",s.data()); } @@ -2201,7 +2220,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, NamespaceSDict *usingNamespaces, SDict<Definition> *usingClasses) { - //printf("match argument start %s:%s <-> %s:%s using nsp=%p class=%p\n", + //printf("match argument start `%s|%s' <-> `%s|%s' using nsp=%p class=%p\n", // srcA->type.data(),srcA->name.data(), // dstA->type.data(),dstA->name.data(), // usingNamespaces, @@ -2214,6 +2233,8 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, QCString srcAType=trimTemplateSpecifiers(namespaceName,className,srcA->type); QCString dstAType=trimTemplateSpecifiers(namespaceName,className,dstA->type); + QCString srcAName=srcA->name.stripWhiteSpace(); + QCString dstAName=dstA->name.stripWhiteSpace(); if (srcAType.left(6)=="class ") srcAType=srcAType.right(srcAType.length()-6); if (dstAType.left(6)=="class ") dstAType=dstAType.right(dstAType.length()-6); @@ -2221,23 +2242,25 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, // from a syntactic point of view they would be two names of the same // type "const". This is not fool prove ofcourse, but should at least // catch the most common cases. - if ((srcAType=="const" || srcAType=="volatile") && !srcA->name.isEmpty()) + if ((srcAType=="const" || srcAType=="volatile") && !srcAName.isEmpty()) { srcAType+=" "; - srcAType+=srcA->name; + srcAType+=srcAName; } - if ((dstAType=="const" || dstAType=="volatile") && !dstA->name.isEmpty()) + if ((dstAType=="const" || dstAType=="volatile") && !dstAName.isEmpty()) { dstAType+=" "; - dstAType+=dstA->name; + dstAType+=dstAName; } - if (srcA->name=="const" || srcA->name=="volatile") + if (srcAName=="const" || srcAName=="volatile") { - srcAType+=srcA->name; + srcAType+=srcAName; + srcAName.resize(0); } - if (dstA->name=="const" || dstA->name=="volatile") + else if (dstA->name=="const" || dstA->name=="volatile") { dstAType+=dstA->name; + dstAName.resize(0); } stripIrrelevantConstVolatile(srcAType); @@ -2260,8 +2283,8 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, //srcAType=stripTemplateSpecifiersFromScope(srcAType,FALSE); //dstAType=stripTemplateSpecifiersFromScope(dstAType,FALSE); - //printf("srcA=%s|%s dstA=%s|%s\n",srcAType.data(),srcA->name.data(), - // dstAType.data(),dstA->name.data()); + //printf("srcA=`%s|%s' dstA=`%s|%s'\n",srcAType.data(),srcAName.data(), + // dstAType.data(),dstAName.data()); if (srcA->array!=dstA->array) // nomatch for char[] against char { @@ -2326,17 +2349,17 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, } } - //printf("2. srcA=%s|%s dstA=%s|%s\n",srcAType.data(),srcA->name.data(), - // dstAType.data(),dstA->name.data()); + //printf("2. srcA=%s|%s dstA=%s|%s\n",srcAType.data(),srcAName.data(), + // dstAType.data(),dstAName.data()); - if (!srcA->name.isEmpty() && !dstA->type.isEmpty() && - (srcAType+" "+srcA->name)==dstAType) + if (!srcAName.isEmpty() && !dstA->type.isEmpty() && + (srcAType+" "+srcAName)==dstAType) { MATCH return TRUE; } - else if (!dstA->name.isEmpty() && !srcA->type.isEmpty() && - (dstAType+" "+dstA->name)==srcAType) + else if (!dstAName.isEmpty() && !srcA->type.isEmpty() && + (dstAType+" "+dstAName)==srcAType) { MATCH return TRUE; @@ -2365,7 +2388,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, { //printf("partial match srcPos=%d dstPos=%d!\n",srcPos,dstPos); // check if a name if already found -> if no then there is no match - if (!srcA->name.isEmpty() || !dstA->name.isEmpty()) + if (!srcAName.isEmpty() || !dstAName.isEmpty()) { NOMATCH return FALSE; @@ -2404,7 +2427,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, { if (!isspace((uchar)dstAType.at(dstPos))) // maybe the names differ { - if (!dstA->name.isEmpty()) // dst has its name separated from its type + if (!dstAName.isEmpty()) // dst has its name separated from its type { NOMATCH return FALSE; @@ -2420,7 +2443,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, { dstPos++; while (dstPos<dstAType.length() && isId(dstAType.at(dstPos))) dstPos++; - if (dstPos!=dstAType.length() || !srcA->name.isEmpty()) + if (dstPos!=dstAType.length() || !srcAName.isEmpty()) { NOMATCH return FALSE; // nope not a name -> no match @@ -2431,7 +2454,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, { if (!isspace((uchar)srcAType.at(srcPos))) // maybe the names differ { - if (!srcA->name.isEmpty()) // src has its name separated from its type + if (!srcAName.isEmpty()) // src has its name separated from its type { NOMATCH return FALSE; @@ -2447,7 +2470,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, { srcPos++; while (srcPos<srcAType.length() && isId(srcAType.at(srcPos))) srcPos++; - if (srcPos!=srcAType.length() || !dstA->name.isEmpty()) + if (srcPos!=srcAType.length() || !dstAName.isEmpty()) { NOMATCH return FALSE; // nope not a name -> no match @@ -2588,6 +2611,20 @@ void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl,bool forceNameOverwr //printf("Defval changing `%s'->`%s'\n",dstA->defval.data(),srcA->defval.data()); dstA->defval=srcA->defval.copy(); } + + // fix wrongly detected const or volatile specificiers before merging. + // example: "const A *const" is detected as type="const A *" name="const" + if (srcA->name=="const" || srcA->name=="volatile") + { + srcA->type+=" "+srcA->name; + srcA->name.resize(0); + } + if (dstA->name=="const" || dstA->name=="volatile") + { + dstA->type+=" "+dstA->name; + dstA->name.resize(0); + } + if (srcA->type==dstA->type) { if (srcA->name.isEmpty() && !dstA->name.isEmpty()) @@ -2671,8 +2708,11 @@ void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl,bool forceNameOverwr { dstA->docs = srcA->docs.copy(); } + //printf("Merge argument `%s|%s' `%s|%s'\n", + // srcA->type.data(),srcA->name.data(), + // dstA->type.data(),dstA->name.data()); } - //printf("result mergeArguments `%s', `%s'\n", + //printf("result mergeArguments `%s|%s', `%s|%s'\n", // argListToString(srcAl).data(),argListToString(dstAl).data()); } diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index ae853b4..7f0181e 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -750,6 +750,8 @@ void XmlDocVisitor::visitPost(DocParamSect *) void XmlDocVisitor::visitPre(DocParamList *pl) { if (m_hide) return; + m_t << "<parameteritem>" << endl; + m_t << "<parameternamelist>" << endl; QStrListIterator li(pl->parameters()); const char *s; for (li.toFirst();(s=li.current());++li) @@ -776,13 +778,15 @@ void XmlDocVisitor::visitPre(DocParamList *pl) filter(s); m_t << "</parametername>" << endl; } + m_t << "</parameternamelist>" << endl; m_t << "<parameterdescription>" << endl; } void XmlDocVisitor::visitPost(DocParamList *) { if (m_hide) return; - m_t << "</parameterdescription>"; + m_t << "</parameterdescription>" << endl; + m_t << "</parameteritem>" << endl; } void XmlDocVisitor::visitPre(DocXRefItem *x) diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp index 27f278a..c5345a6 100644 --- a/src/xmlgen.cpp +++ b/src/xmlgen.cpp @@ -718,7 +718,9 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De t << " <param><defname>" << a->type << "</defname></param>" << endl; } } - if (!md->initializer().isEmpty()) + // avoid that extremely large tables are written to the output. + // todo: it's better to adhere to MAX_INITIALIZER_LINES. + if (!md->initializer().isEmpty() && md->initializer().length()<2000) { t << " <initializer>"; linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md->name(),md->initializer()); |