From 7e81d44c98dbbb1bb30d623be52ca76bbd880038 Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Sun, 29 Oct 2006 18:39:28 +0000 Subject: Release-1.5.1 --- INSTALL | 4 +- Makefile.in | 4 ++ README | 4 +- addon/doxyapp/doxyapp.cpp | 3 +- addon/doxywizard/doxywizard.cpp | 2 +- configure | 2 +- src/classdef.cpp | 4 +- src/docparser.cpp | 4 ++ src/doxygen.cpp | 86 +++++++++++++++++++++++++++++------------ src/doxygen.h | 2 + src/entry.cpp | 4 +- src/filedef.cpp | 12 +++++- src/filedef.h | 2 +- src/latexdocvisitor.cpp | 29 ++++++++++---- src/latexgen.cpp | 2 +- src/lockingptr.h | 8 ++-- src/memberdef.cpp | 2 +- src/membergroup.cpp | 3 +- src/memberlist.cpp | 4 +- src/namespacedef.cpp | 7 ++++ src/namespacedef.h | 2 +- src/pre.l | 18 ++++++++- src/pycode.l | 21 +++++----- src/pyscanner.l | 2 + src/util.cpp | 17 +++++++- src/util.h | 2 + winbuild/Doxygen.vcproj | 1 + winbuild/Doxytag.vcproj | 1 + winbuild/Doxywizard.vcproj | 23 +++++++++-- 29 files changed, 209 insertions(+), 66 deletions(-) diff --git a/INSTALL b/INSTALL index cda7a83..0867c3c 100644 --- a/INSTALL +++ b/INSTALL @@ -1,7 +1,7 @@ -DOXYGEN Version 1.5.0 +DOXYGEN Version 1.5.1 Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (17 October 2006) +Dimitri van Heesch (29 October 2006) diff --git a/Makefile.in b/Makefile.in index f30169c..68aa1f5 100644 --- a/Makefile.in +++ b/Makefile.in @@ -140,5 +140,9 @@ rpmbinary: dist gzip -9v $(DISTDIR).src.tar rpmbuild -tb $(DISTDIR).src.tar.gz + +ctags: + ctags -f tags src addon/doxywizard qtools + FORCE: diff --git a/README b/README index fa5cf00..79990e8 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -DOXYGEN Version 1.5.0 +DOXYGEN Version 1.5.1 Please read INSTALL for compilation instructions. @@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. Enjoy, -Dimitri van Heesch (dimitri@stack.nl) (17 October 2006) +Dimitri van Heesch (dimitri@stack.nl) (29 October 2006) diff --git a/addon/doxyapp/doxyapp.cpp b/addon/doxyapp/doxyapp.cpp index 0de169d..b453815 100644 --- a/addon/doxyapp/doxyapp.cpp +++ b/addon/doxyapp/doxyapp.cpp @@ -291,7 +291,8 @@ int main(int argc,char **argv) } // remove temporary files - unlink("/tmp/doxygen/doxygen_objdb.tmp"); + if (!Doxygen::objDBFileName.isEmpty()) unlink(Doxygen::objDBFileName); + if (!Doxygen::entryDBFileName.isEmpty()) unlink(Doxygen::entryDBFileName); // clean up after us rmdir("/tmp/doxygen"); diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp index a48058c..c929152 100644 --- a/addon/doxywizard/doxywizard.cpp +++ b/addon/doxywizard/doxywizard.cpp @@ -1316,7 +1316,7 @@ void MainWidget::about() QTextStream t(&msg,IO_WriteOnly); t << QString("
A tool to configure and run doxygen version ")+versionString+ " on your source files.


" - "

Written by
Dimitri van Heesch
© 2000-2005

" + "

Written by
Dimitri van Heesch
© 2000-2006

" ""; QMessageBox::about(this,"Doxygen GUI",msg); } diff --git a/configure b/configure index 839a2df..251a304 100755 --- a/configure +++ b/configure @@ -17,7 +17,7 @@ doxygen_version_major=1 doxygen_version_minor=5 -doxygen_version_revision=0 +doxygen_version_revision=1 #NOTE: Setting version_mmn to "NO" will omit mmn info from the package. doxygen_version_mmn=NO diff --git a/src/classdef.cpp b/src/classdef.cpp index 8dffbd9..9ed8c1f 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -3061,7 +3061,9 @@ void ClassDef::addMemberToList(MemberList::ListType lt,MemberDef *md) ml->inSort(md); else ml->append(md); - md->setSectionList(this,ml); + + // for members in the declaration lists we set the section, needed for member grouping + if ((ml->listType()&MemberList::detailedLists)==0) md->setSectionList(this,ml); } void ClassDef::writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title, diff --git a/src/docparser.cpp b/src/docparser.cpp index c7a621a..d28164f 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -1674,6 +1674,10 @@ void DocCopy::parse() g_styleStack.clear(); g_nodeStack.clear(); g_copyStack.append(def); + // make sure the descriptions end with a newline, so the parser will correctly + // handle them in all cases. + brief+='\n'; + doc+='\n'; internalValidatingParseDoc(this,m_children,brief); internalValidatingParseDoc(this,m_children,doc); g_copyStack.remove(def); diff --git a/src/doxygen.cpp b/src/doxygen.cpp index f825d34..2aff8fd 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -72,7 +72,6 @@ #include "store.h" #include "marshal.h" - #define RECURSE_ENTRYTREE(func,var) \ do { if (var->children()) { \ EntryNavListIterator eli(*var->children()); \ @@ -85,6 +84,11 @@ #define pclose _pclose #endif +#if !defined(_WIN32) || defined(__CYGWIN__) +#include +#define HAS_SIGNALS +#endif + // globally accessible variables ClassSDict *Doxygen::classSDict = 0; ClassSDict *Doxygen::hiddenClasses = 0; @@ -129,6 +133,8 @@ QCString Doxygen::htmlFileExtension; bool Doxygen::suppressDocWarnings = FALSE; ObjCache *Doxygen::symbolCache = 0; Store *Doxygen::symbolStorage; +QCString Doxygen::objDBFileName; +QCString Doxygen::entryDBFileName; // locally accessible globals static QDict classEntries(1009); @@ -144,6 +150,7 @@ FileStorage *g_storage = 0; QCString spaces; + void clearAll() { inputFiles.clear(); @@ -6299,39 +6306,41 @@ static void addEnumValuesToEnums(EntryNav *rootNav) if (cd && !name.isEmpty()) // found a enum inside a compound { - //printf("Enum `%s'::`%s'\n",cd->name(),name.data()); + //printf("Enum in class `%s'::`%s'\n",cd->name().data(),name.data()); fd=0; mnsd=Doxygen::memberNameSDict; isGlobal=FALSE; } else if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') // found enum inside namespace { + //printf("Enum in namespace `%s'::`%s'\n",nd->name().data(),name.data()); mnsd=Doxygen::functionNameSDict; isGlobal=TRUE; } else // found a global enum { fd=rootNav->fileDef(); + //printf("Enum in file `%s': `%s'\n",fd->name().data(),name.data()); mnsd=Doxygen::functionNameSDict; isGlobal=TRUE; } if (!name.isEmpty()) { - MemberName *mn = mnsd->find(name); + MemberName *mn = mnsd->find(name); // for all members with this name if (mn) { MemberNameIterator mni(*mn); MemberDef *md; - for (mni.toFirst(); (md=mni.current()) ; ++mni) + for (mni.toFirst(); (md=mni.current()) ; ++mni) // for each enum in this list { if (md->isEnumerate() && rootNav->children()) { - EntryNavListIterator eli(*rootNav->children()); + EntryNavListIterator eli(*rootNav->children()); // for each enum value EntryNav *e; for (;(e=eli.current());++eli) { - //printf("e->name=%s isRelated=%d\n",e->name.data(),isRelated); + //printf("e->name=%s isRelated=%d\n",e->name().data(),isRelated); MemberName *fmn=0; MemberNameSDict *emnsd = isRelated ? Doxygen::functionNameSDict : mnsd; if (!e->name().isEmpty() && (fmn=(*emnsd)[e->name()])) @@ -6341,9 +6350,10 @@ static void addEnumValuesToEnums(EntryNav *rootNav) MemberDef *fmd; for (fmni.toFirst(); (fmd=fmni.current()) ; ++fmni) { - if (fmd->isEnumValue()) + if (fmd->isEnumValue() && fmd->getOuterScope()==md->getOuterScope()) // in same scope { - //printf("found enum value with same name\n"); + //printf("found enum value with same name %s in scope %s\n", + // fmd->name().data(),fmd->getOuterScope()->name().data()); if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') { NamespaceDef *fnd=fmd->getNamespaceDef(); @@ -8208,7 +8218,7 @@ static int readDir(QFileInfo *fi, { if (errorIfNotExist) { - err("Error: source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data()); + err("Warning: source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data()); } } else if (cfi->isFile() && @@ -8297,7 +8307,7 @@ static int readFileOrDirectory(const char *s, { if (errorIfNotExist) { - err("Error: source %s is not a readable file or directory... skipping.\n",s); + err("Warning: source %s is not a readable file or directory... skipping.\n",s); } } else if (!Config_getBool("EXCLUDE_SYMLINKS") || !fi.isSymLink()) @@ -8366,7 +8376,7 @@ static void readFormulaRepository() int se=line.find(':'); // find name and text separator. if (se==-1) { - err("Error: formula.repository is corrupted!\n"); + err("Warning: formula.repository is corrupted!\n"); break; } else @@ -8556,7 +8566,7 @@ void initDoxygen() setlocale(LC_ALL,""); setlocale(LC_NUMERIC,"C"); #endif - + //Doxygen::symbolMap->setAutoDelete(TRUE); Doxygen::runningTime.start(); @@ -8746,7 +8756,7 @@ void readConfiguration(int argc, char **argv) QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE"); if (!setTranslator(outputLanguage)) { - err("Error: Output language %s not supported! Using English instead.\n", outputLanguage.data()); + err("Warning: Output language %s not supported! Using English instead.\n", outputLanguage.data()); } QFile f; @@ -8794,7 +8804,7 @@ void readConfiguration(int argc, char **argv) QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE"); if (!setTranslator(outputLanguage)) { - err("Error: Output language %s not supported! Using English instead.\n", outputLanguage.data()); + err("Warning: Output language %s not supported! Using English instead.\n", outputLanguage.data()); } QFile f; @@ -8920,7 +8930,7 @@ void checkConfiguration() QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE"); if (!setTranslator(outputLanguage)) { - err("Error: Output language %s not supported! Using English instead.\n", + err("Warning: Output language %s not supported! Using English instead.\n", outputLanguage.data()); } QStrList &includePath = Config_getList("INCLUDE_PATH"); @@ -8944,6 +8954,24 @@ void checkConfiguration() } +#ifdef HAS_SIGNALS +static void stopDoxygen(int) +{ + QDir thisDir; + msg("Cleaning up...\n"); + if (!Doxygen::entryDBFileName.isEmpty()) + { + thisDir.remove(Doxygen::entryDBFileName); + } + if (!Doxygen::objDBFileName.isEmpty()) + { + thisDir.remove(Doxygen::objDBFileName); + } + exit(1); +} +#endif + + void parseInput() { /************************************************************************** @@ -8986,9 +9014,19 @@ void parseInput() // ~2.0 MByte "overhead" Doxygen::symbolStorage = new Store; - if (Doxygen::symbolStorage->open(outputDirectory+"/doxygen_objdb.tmp")==-1) +#ifdef HAS_SIGNALS + signal(SIGINT, stopDoxygen); +#endif + + uint pid = iPid(); + Doxygen::objDBFileName.sprintf("doxygen_objdb_%d.tmp",pid); + Doxygen::objDBFileName.prepend(outputDirectory+"/"); + Doxygen::entryDBFileName.sprintf("doxygen_entrydb_%d.tmp",pid); + Doxygen::entryDBFileName.prepend(outputDirectory+"/"); + + if (Doxygen::symbolStorage->open(Doxygen::objDBFileName)==-1) { - err("Failed to open temporary file %s\n",(outputDirectory+"/doxygen_objdb.tmp").data()); + err("Failed to open temporary file %s\n",Doxygen::objDBFileName.data()); exit(1); } @@ -9265,11 +9303,11 @@ void parseInput() **************************************************************************/ g_storage = new FileStorage; - g_storage->setName(outputDirectory+"/doxygen_entrydb.tmp"); + g_storage->setName(Doxygen::entryDBFileName); if (!g_storage->open(IO_WriteOnly)) { - err("Failed to create temporary storage file %s/doxygen_entrydb.tmp\n", - outputDirectory.data()); + err("Failed to create temporary storage file %s\n", + Doxygen::entryDBFileName.data()); exit(1); } Entry *root=new Entry; @@ -9294,8 +9332,8 @@ void parseInput() g_storage->close(); if (!g_storage->open(IO_ReadOnly)) { - err("Failed to open temporary storage file %s/doxygen_entrydb.tmp for reading", - outputDirectory.data()); + err("Failed to open temporary storage file %s for reading", + Doxygen::entryDBFileName.data()); exit(1); } @@ -9430,7 +9468,7 @@ void parseInput() g_storage=0; QDir thisDir; - thisDir.remove(outputDirectory+"/doxygen_entrydb.tmp"); + thisDir.remove(Doxygen::entryDBFileName); msg("Determining which enums are documented\n"); findDocumentedEnumValues(); @@ -9776,7 +9814,7 @@ void generateOutput() finializeDocParser(); Doxygen::symbolStorage->close(); QDir thisDir; - thisDir.remove(Config_getString("OUTPUT_DIRECTORY")+"/doxygen_objdb.tmp"); + thisDir.remove(Doxygen::objDBFileName); Config::deleteInstance(); QTextCodec::deleteAllCodecs(); delete Doxygen::symbolCache; diff --git a/src/doxygen.h b/src/doxygen.h index 92c09ba..c52829c 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -121,6 +121,8 @@ class Doxygen static bool suppressDocWarnings; static ObjCache *symbolCache; static Store *symbolStorage; + static QCString objDBFileName; + static QCString entryDBFileName; }; void initDoxygen(); diff --git a/src/entry.cpp b/src/entry.cpp index 34d7241..1aa6b6d 100644 --- a/src/entry.cpp +++ b/src/entry.cpp @@ -21,6 +21,7 @@ #include "marshal.h" #include "util.h" #include "section.h" +#include "doxygen.h" int Entry::num=0; @@ -394,7 +395,8 @@ static bool loadEntry(Entry *e,FileStorage *f) uint header=unmarshalUInt(f); if (header!=HEADER) { - printf("Internal error: Invalid header for entry in storage file: %x. Disk full?\n",header); + printf("Internal error: Invalid header %x for entry in storage file %s\n", + header,Doxygen::entryDBFileName.data()); exit(1); } e->protection = (Protection)unmarshalInt(f); diff --git a/src/filedef.cpp b/src/filedef.cpp index 7214a56..0a3c814 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -840,6 +840,13 @@ void FileDef::addUsingDirective(NamespaceDef *nd) { usingDirList->append(nd->qualifiedName(),nd); } + //printf("%p: FileDef::addUsingDirective: %s:%d\n",this,name().data(),usingDirList->count()); +} + +NamespaceSDict *FileDef::getUsedNamespaces() const +{ + //printf("%p: FileDef::getUsedNamespace: %s:%d\n",this,name().data(),usingDirList?usingDirList->count():0); + return usingDirList; } void FileDef::addUsingDeclaration(Definition *d) @@ -917,7 +924,10 @@ void FileDef::addIncludedUsingDirectives() if (usingDirList==0) usingDirList = new NamespaceSDict; //printf("Prepending used namespace %s to the list of file %s\n", // nd->name().data(),name().data()); - usingDirList->prepend(nd->qualifiedName(),nd); + if (usingDirList->find(nd->qualifiedName())==0) // not yet added + { + usingDirList->prepend(nd->qualifiedName(),nd); + } } } } diff --git a/src/filedef.h b/src/filedef.h index 15554e2..c5b99ab 100644 --- a/src/filedef.h +++ b/src/filedef.h @@ -150,7 +150,7 @@ class FileDef : public Definition DirDef *getDirDef() const { return dir; } void addUsingDirective(NamespaceDef *nd); - NamespaceSDict *getUsedNamespaces() const { return usingDirList; } + NamespaceSDict *getUsedNamespaces() const; void addUsingDeclaration(Definition *def); SDict *getUsedClasses() const { return usingDeclList; } void combineUsingRelations(); diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index 8c1e757..a780434 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -1021,18 +1021,33 @@ void LatexDocVisitor::filter(const char *str) void LatexDocVisitor::startLink(const QString &ref,const QString &file,const QString &anchor) { - if (ref.isEmpty() && Config_getBool("PDF_HYPERLINKS")) + if (ref.isEmpty() && Config_getBool("PDF_HYPERLINKS")) // internal PDF link { - m_t << "\\hyperlink{"; - if (!file.isEmpty()) m_t << stripPath(file); - if (!file.isEmpty() && !anchor.isEmpty()) m_t << "_"; - if (!anchor.isEmpty()) m_t << anchor; - m_t << "}{"; + if (ref.isEmpty()) { + m_t << "\\hyperlink{"; + if (!file.isEmpty()) m_t << stripPath(file); + if (!file.isEmpty() && !anchor.isEmpty()) m_t << "_"; + if (!anchor.isEmpty()) m_t << anchor; + m_t << "}{"; + } + else + { + QCString *dest; + m_t << "\\href{"; + if ((dest=Doxygen::tagDestinationDict[ref])) m_t << *dest << "/"; + if (!file.isEmpty()) m_t << file << Doxygen::htmlFileExtension; + if (!anchor.isEmpty()) m_t << "#" << anchor; + m_t << "}{"; + } } - else + else if (ref.isEmpty()) // internal non-PDF link { m_t << "\\doxyref{"; } + else // external link + { + m_t << "{\\bf "; + } } void LatexDocVisitor::endLink(const QString &ref,const QString &file,const QString &anchor) diff --git a/src/latexgen.cpp b/src/latexgen.cpp index df39700..98891f4 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -1002,7 +1002,7 @@ void LatexGenerator::writeObjectLink(const char *ref, const char *f, } else { - t << "{\\bf"; + t << "{\\bf "; docify(text); t << "}"; } diff --git a/src/lockingptr.h b/src/lockingptr.h index 1936bec..99a1772 100644 --- a/src/lockingptr.h +++ b/src/lockingptr.h @@ -37,15 +37,17 @@ class LockableObj /*! Returns TRUE if the object is currently locked. */ bool isLocked() const { return m_lockCount>0; } - protected: +//VC++6.0 workaround +// protected: /*! Called when the object is locked. */ virtual void lock() const = 0; /*! Called when the object is unlocked. */ virtual void unlock() const = 0; - private: - template friend class LockingPtr; +//VC++6.0 workaround +// private: +// template friend class LockingPtr; int m_lockCount; }; diff --git a/src/memberdef.cpp b/src/memberdef.cpp index a450ba3..56c8013 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -818,7 +818,6 @@ QCString MemberDef::getOutputFileBase() const "Warning: Internal inconsistency: member %s does not belong to any" " container!",name().data() ); - exit(1); return "dummy"; } else if (separateMemberPages) @@ -2634,6 +2633,7 @@ MemberList *MemberDef::getSectionList(Definition *d) const void MemberDef::setSectionList(Definition *d, MemberList *sl) { makeResident(); + //printf("MemberDef::setSectionList(%p,%p) name=%s\n",d,sl,name().data()); char key[20]; sprintf(key,"%p",d); if (m_impl->classSectionSDict==0) diff --git a/src/membergroup.cpp b/src/membergroup.cpp index ba599da..900a6e0 100644 --- a/src/membergroup.cpp +++ b/src/membergroup.cpp @@ -79,6 +79,7 @@ void MemberGroup::insertMember(MemberDef *md) else if (inDeclSection==0) { inDeclSection = md->getSectionList(m_parent); + //printf("inDeclSection=%p type=%d\n",inDeclSection,inDeclSection->listType()); } memberList->append(md); @@ -133,7 +134,7 @@ void MemberGroup::addToDeclarationSection() { if (inDeclSection) { - //printf("Adding group %p to list %p\n",this,inDeclSection); + //printf("Adding group %p to list %p (type=%d)\n",this,inDeclSection,inDeclSection->listType()); inDeclSection->addMemberGroup(this); } } diff --git a/src/memberlist.cpp b/src/memberlist.cpp index 218bbd3..8864488 100644 --- a/src/memberlist.cpp +++ b/src/memberlist.cpp @@ -313,7 +313,7 @@ void MemberList::writeDeclarations(OutputList &ol, const char *title,const char *subtitle, bool showEnumValues /*, bool inGroup,bool countSubGroups*/) { - //printf("----- writeDeclaration() ----\n"); + //printf("----- writeDeclaration() this=%p ----\n",this); countDecMembers(showEnumValues); // count member not in group if (numDecMembers()==0) return; //printf("%p: MemberList::writeDeclaration(title=`%s',subtitle=`%s')=%d\n", @@ -341,6 +341,7 @@ void MemberList::writeDeclarations(OutputList &ol, MemberGroup *mg; while ((mg=mgli.current())) { + //printf("mg->header=%s\n",mg->header().data()); bool hasHeader=mg->header()!="[NOHEADER]"; ol.startMemberGroupHeader(hasHeader); if (hasHeader) @@ -450,6 +451,7 @@ void MemberList::addMemberGroup(MemberGroup *mg) { memberGroupList=new MemberGroupList; } + //printf("addMemberGroup: this=%p mg=%p\n",this,mg); memberGroupList->append(mg); } diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index 1cbe197..54278b1 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -483,6 +483,13 @@ void NamespaceDef::addUsingDirective(NamespaceDef *nd) { usingDirList->append(nd->qualifiedName(),nd); } + //printf("%p: NamespaceDef::addUsingDirective: %s:%d\n",this,name().data(),usingDirList->count()); +} + +NamespaceSDict *NamespaceDef::getUsedNamespaces() const +{ + //printf("%p: NamespaceDef::getUsedNamespace: %s:%d\n",this,name().data(),usingDirList?usingDirList->count():0); + return usingDirList; } void NamespaceDef::addUsingDeclaration(Definition *d) diff --git a/src/namespacedef.h b/src/namespacedef.h index b720912..827ace3 100644 --- a/src/namespacedef.h +++ b/src/namespacedef.h @@ -58,7 +58,7 @@ class NamespaceDef : public Definition void computeAnchors(); int countMembers(); void addUsingDirective(NamespaceDef *nd); - NamespaceSDict *getUsedNamespaces() const { return usingDirList; } + NamespaceSDict *getUsedNamespaces() const; void addUsingDeclaration(Definition *def); SDict *getUsedClasses() const { return usingDeclList; } void combineUsingRelations(); diff --git a/src/pre.l b/src/pre.l index 08a8486..2b9025e 100644 --- a/src/pre.l +++ b/src/pre.l @@ -1222,6 +1222,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) %x CopyString %x Include %x IncludeID +%x EndImport %x DefName %x DefineArg %x DefineText @@ -1700,7 +1701,22 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) [^\">\n]+[\">] { g_incName+=yytext; readIncludeFile(g_incName); - BEGIN(Start); + if (g_isImported) + { + BEGIN(EndImport); + } + else + { + BEGIN(Start); + } + } +[^\\]*/\n { + BEGIN(Start); + } +\\[\r]?"\n" { + outputChar('\n'); + } +. { } {ID}/"(" { //printf("Define() `%s'\n",yytext); diff --git a/src/pycode.l b/src/pycode.l index 8cc79a4..13e79cd 100644 --- a/src/pycode.l +++ b/src/pycode.l @@ -755,18 +755,21 @@ static void findMemberLink(CodeOutputInterface &ol,char *symName) if (g_currentDefinition) { DefinitionIntf *di = Doxygen::symbolMap->find(symName); - if (di->definitionType()==DefinitionIntf::TypeSymbolList) // multiple symbols + if (di) { - DefinitionListIterator dli(*(DefinitionList*)di); - Definition *sym; - for (dli.toFirst();(sym=dli.current());++dli) + if (di->definitionType()==DefinitionIntf::TypeSymbolList) // multiple symbols { - findMemberLink(ol,sym,symName); + DefinitionListIterator dli(*(DefinitionList*)di); + Definition *sym; + for (dli.toFirst();(sym=dli.current());++dli) + { + findMemberLink(ol,sym,symName); + } + } + else // single symbol + { + findMemberLink(ol,(Definition*)di,symName); } - } - else // single symbol - { - findMemberLink(ol,(Definition*)di,symName); } } //printf("sym %s not found\n",&yytext[5]); diff --git a/src/pyscanner.l b/src/pyscanner.l index 0a4fbcf..db39ff4 100644 --- a/src/pyscanner.l +++ b/src/pyscanner.l @@ -797,11 +797,13 @@ STARTDOCSYMS ^{B}"##"/[^#] } {TRIDOUBLEQUOTE} { // start of a comment block + current->program+=yytext; initTriDoubleQuoteBlock(); BEGIN(TripleComment); } {TRISINGLEQUOTE} { // start of a comment block + current->program+=yytext; initTriSingleQuoteBlock(); BEGIN(TripleComment); } diff --git a/src/util.cpp b/src/util.cpp index 96f0e84..1cef237 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -254,6 +254,17 @@ int iSystem(const char *command,const char *args,bool commandHasConsole) } +uint iPid() +{ + uint pid; +#if !defined(_WIN32) || defined(__CYGWIN__) + pid = (uint)getpid(); +#else + pid = (uint)GetCurrentProcessId(); +#endif + return pid; +} + @@ -886,9 +897,11 @@ bool accessibleViaUsingNamespace(const NamespaceSDict *nl, { NamespaceSDict::Iterator nli(*nl); NamespaceDef *und; - for (nli.toFirst();(und=nli.current());++nli) + int count=0; + for (nli.toFirst();(und=nli.current());++nli,count++) { - //printf("[Trying via used namespace %s\n",und->name().data()); + //printf("[Trying via used namespace %s: count=%d/%d\n",und->name().data(), + // count,nl->count()); Definition *sc = explicitScopePart.isEmpty() ? und : followPath(und,fileScope,explicitScopePart); if (sc && item->getOuterScope()==sc) { diff --git a/src/util.h b/src/util.h index fb6de09..b6cd1ba 100644 --- a/src/util.h +++ b/src/util.h @@ -235,6 +235,8 @@ QCString stripScope(const char *name); int iSystem(const char *command,const char *args,bool commandHasConsole=TRUE); +uint iPid(); + QCString convertToHtml(const char *s); QCString convertToXML(const char *s); diff --git a/winbuild/Doxygen.vcproj b/winbuild/Doxygen.vcproj index ef25e82..e5cfc6f 100644 --- a/winbuild/Doxygen.vcproj +++ b/winbuild/Doxygen.vcproj @@ -76,6 +76,7 @@ LinkIncremental="2" SuppressStartupBanner="true" AdditionalLibraryDirectories="Debug" + GenerateManifest="false" GenerateDebugInformation="true" ProgramDatabaseFile=".\Debug/Doxygen.pdb" SubSystem="1" diff --git a/winbuild/Doxytag.vcproj b/winbuild/Doxytag.vcproj index 9c5e82e..b09e917 100644 --- a/winbuild/Doxytag.vcproj +++ b/winbuild/Doxytag.vcproj @@ -74,6 +74,7 @@ LinkIncremental="2" SuppressStartupBanner="true" AdditionalLibraryDirectories="Debug" + GenerateManifest="false" GenerateDebugInformation="true" ProgramDatabaseFile=".\Debug/Doxytag.pdb" SubSystem="1" diff --git a/winbuild/Doxywizard.vcproj b/winbuild/Doxywizard.vcproj index f90f6ac..b2cf022 100644 --- a/winbuild/Doxywizard.vcproj +++ b/winbuild/Doxywizard.vcproj @@ -46,11 +46,12 @@ + + + + -- cgit v0.12