Commit 3c814844 authored by dimitri's avatar dimitri

Release-1.4.7-20061004

parent c844985a
DOXYGEN Version 1.4.7-20060910
DOXYGEN Version 1.4.7-20061004
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (10 September 2006)
Dimitri van Heesch (04 October 2006)
......@@ -84,7 +84,7 @@ pdf: docs
DISTFILES = Doxyfile libpng libmd5 addon tmake doc wintools examples bin lib objects \
qtools src configure configure.bin Makefile.in Makefile.win_nmake.in \
Makefile.win_make.in INSTALL make.bat LANGUAGE.HOWTO LICENSE PLATFORMS \
VERSION packages
VERSION packages winbuild
archive: clean
tar zcvf dx`date +%y%m%d`.tgz $(DISTFILES)
......
DOXYGEN Version 1.4.7_20060910
DOXYGEN Version 1.4.7_20061004
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) (10 September 2006)
Dimitri van Heesch (dimitri@stack.nl) (04 October 2006)
......@@ -20,7 +20,7 @@ doxygen_version_minor=4
doxygen_version_revision=7
#NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
doxygen_version_mmn=20060910
doxygen_version_mmn=20061004
bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
......
......@@ -37,8 +37,9 @@
\section linkclass Links to classes.
All words in the documentation that correspond to a documented class
will automatically be replaced by a link to the page containing the
All words in the documentation that correspond to a documented class and
contain at least one upper case character will automatically be replaced by
a link to the page containing the
documentation of the class. If you want to prevent that a word
that corresponds to a documented class is replaced by a link you
should put a \% in front of the word.
......@@ -59,17 +60,23 @@
<li><tt>\<functionName\>"()"</tt>
<li><tt>"::"\<functionName\></tt>
<li><tt>(\<className\>"::")<sup>n</sup>\<functionName\>"("\<argument-list\>")"</tt>
<li><tt>(\<className\>"::")<sup>n</sup>\<functionName\>"("\<argument-list\>")"\<modifiers\></tt>
<li><tt>(\<className\>"::")<sup>n</sup>\<functionName\>"()"</tt>
<li><tt>(\<className\>"::")<sup>n</sup>\<functionName\></tt>
</ol>
where n\>0.
\par Note 1:
The patterns above should not contain spaces, tabs or newlines.
\par Note 2:
Function arguments should be specified with correct types, i.e.
'fun(const std::string&,bool)' or '()' to match any prototype.
\par Note 2:
Member function modifiers (like 'const' and 'volatile')
are required to identify the target, i.e. 'func(int) const' and 'fun(int)'
target different member functions.
\par Note 3:
For JavaDoc compatibility a \# may be used instead of a :: in
the patterns above.
\par Note 3:
\par Note 4:
In the documentation of a class containing a member foo,
a reference to a global variable is made using ::foo, whereas \#foo
will link to the member.
......
......@@ -102,7 +102,7 @@ when the translator was updated.
<td>Danish</td>
<td>Erik S&oslash;e S&oslash;rensen</td>
<td>eriksoe+doxygen at daimi dot au dot dk</td>
<td>1.3.9</td>
<td>up-to-date</td>
</tr>
<tr bgcolor="#ffffff">
<td>Dutch</td>
......@@ -162,7 +162,7 @@ when the translator was updated.
<td>Japanese</td>
<td>Ryunosuke Satoh<br>Kenji Nagamatsu<br>Iwasa Kazmi</td>
<td>sun594 at hotmail dot com<br>naga at joyful dot club dot ne dot jp<br>iwasa at cosmo-system dot jp</td>
<td>1.4.6</td>
<td>up-to-date</td>
</tr>
<tr bgcolor="#ffffff">
<td>JapaneseEn</td>
......@@ -294,7 +294,7 @@ when the translator was updated.
\hline
Czech & Petr P\v{r}ikryl & {\tt\tiny prikrylp@skil.cz} & up-to-date \\
\hline
Danish & Erik S\o{}e S\o{}rensen & {\tt\tiny eriksoe+doxygen@daimi.au.dk} & 1.3.9 \\
Danish & Erik S\o{}e S\o{}rensen & {\tt\tiny eriksoe+doxygen@daimi.au.dk} & up-to-date \\
\hline
Dutch & Dimitri van Heesch & {\tt\tiny dimitri@stack.nl} & up-to-date \\
\hline
......@@ -316,7 +316,7 @@ when the translator was updated.
Italian & Alessandro Falappa & {\tt\tiny alessandro@falappa.net} & up-to-date \\
~ & Ahmed Aldo Faisal & {\tt\tiny aaf23@cam.ac.uk} & ~ \\
\hline
Japanese & Ryunosuke Satoh & {\tt\tiny sun594@hotmail.com} & 1.4.6 \\
Japanese & Ryunosuke Satoh & {\tt\tiny sun594@hotmail.com} & up-to-date \\
~ & Kenji Nagamatsu & {\tt\tiny naga@joyful.club.ne.jp} & ~ \\
~ & Iwasa Kazmi & {\tt\tiny iwasa@cosmo-system.jp} & ~ \\
\hline
......
......@@ -8,7 +8,7 @@ German, Greek, Hungarian, Indonesian, Italian, Japanese (+En), Korean
(+En), Lithuanian, Norwegian, Persian, Polish, Portuguese, Romanian,
Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
Of them, 10 translators are up-to-date, 23 translators are based on
Of them, 12 translators are up-to-date, 21 translators are based on
some adapter class, and 2 are English based.
----------------------------------------------------------------------
......@@ -22,10 +22,12 @@ still may be some details listed even for them:
TranslatorChinese
TranslatorCroatian
TranslatorCzech
TranslatorDanish -- Change the base class to Translator.
TranslatorDutch -- Remove the obsolete methods (never used).
TranslatorEnglish -- Remove the obsolete methods (never used).
TranslatorGerman
TranslatorItalian -- Change the base class to Translator.
TranslatorJapanese -- Remove the obsolete methods (never used).
TranslatorRussian
----------------------------------------------------------------------
......@@ -42,7 +44,6 @@ must be implemented to become up-to-date:
TranslatorNorwegian 1.4.6 1 method to implement
TranslatorLithuanian 1.4.6 2 methods to implement
TranslatorKorean 1.4.6 2 methods to implement
TranslatorJapanese 1.4.6 1 method to implement
TranslatorIndonesian 1.4.6 1 method to implement
TranslatorHungarian 1.4.6 2 methods to implement
TranslatorFrench 1.4.6 1 method to implement
......@@ -52,7 +53,6 @@ must be implemented to become up-to-date:
TranslatorUkrainian 1.4.1 2 methods to implement
TranslatorSerbian 1.4.1 2 methods to implement
TranslatorRomanian 1.4.1 2 methods to implement
TranslatorDanish 1.3.9 8 methods to implement
TranslatorPortuguese 1.3.3 13 methods to implement
TranslatorSlovak 1.2.18 22 methods to implement
TranslatorGreek 1.2.11 27 methods to implement
......@@ -145,21 +145,10 @@ TranslatorChinesetraditional (TranslatorAdapter_1_4_6) 1 method to implement
virtual QCString trNoDescriptionAvailable()
TranslatorDanish (TranslatorAdapter_1_3_9) 8 methods to implement
TranslatorDanish (TranslatorAdapter_1_3_9)
----------------
Implements 186 of the required methods.
Missing methods (should be implemented):
virtual QCString trOverloadText()
virtual QCString trDirIndex()
virtual QCString trDirDocumentation()
virtual QCString trDirectories()
virtual QCString trDirDescription()
virtual QCString trCallerGraph()
virtual QCString trDirReference(const char * dirName)
virtual QCString trDir(bool first_capital, bool singular)
Implements 194 of the required methods.
Obsolete methods (should be removed, never used):
......@@ -435,14 +424,10 @@ TranslatorItalian (TranslatorAdapter_1_4_6)
Implements 194 of the required methods.
TranslatorJapanese (TranslatorAdapter_1_4_6) 1 method to implement
TranslatorJapanese (Translator)
------------------
Implements 193 of the required methods.
Missing methods (should be implemented):
virtual QCString trCallerGraph()
Implements 194 of the required methods.
Obsolete methods (should be removed, never used):
......
......@@ -262,6 +262,19 @@
#error "Qt has not been tested with this compiler - talk to qt-bugs@trolltech.com"
#endif
// detect Microsoft compiler version
#ifdef _CC_MSVC_
#if _MSC_VER >= 1400
#define _CC_V2005
#elif _MSC_VER >= 1310
#define _CC_V2003
#elif _MSC_VER > 1300
#define _CC_V2002
#else
#define _CC_V1998
#endif
#endif
#ifndef Q_PACKED
#define Q_PACKED
#endif
......
......@@ -168,6 +168,8 @@ class ClassDefImpl
* groups?
*/
bool subGrouping;
bool usedOnly;
};
void ClassDefImpl::init(const char *defFileName, const char *name,
......@@ -206,6 +208,7 @@ void ClassDefImpl::init(const char *defFileName, const char *name,
isTemplArg = FALSE;
membersMerged = FALSE;
categoryOf = 0;
usedOnly = FALSE;
QCString ns;
extractNamespaceName(name,className,ns);
//printf("m_name=%s m_className=%s ns=%s\n",m_name.data(),m_className.data(),ns.data());
......@@ -258,78 +261,11 @@ ClassDef::ClassDef(
m_impl->isObjC = FALSE;
m_impl->init(defFileName,name(),compoundTypeString(),fName);
#if 0
m_compType=ct;
m_isObjC = FALSE;
QCString compoundName=compoundTypeString();
if (fName)
{
m_fileName=stripExtension(fName);
}
else
{
m_fileName=compoundName+name();
}
m_exampleSDict = 0;
m_inherits = 0;
m_inheritedBy = 0;
m_allMemberNameInfoSDict = 0;
m_incInfo=0;
m_tempArgs=0;
m_prot=Public;
m_nspace=0;
m_fileDef=0;
m_usesImplClassDict=0;
m_usedByImplClassDict=0;
m_usesIntfClassDict=0;
memberGroupSDict = 0;
m_innerClasses = 0;
m_subGrouping=Config_getBool("SUBGROUPING");
m_templateInstances = 0;
m_variableInstances = 0;
m_templateMaster =0;
m_templBaseClassNames = 0;
m_artificial = FALSE;
m_isAbstract = FALSE;
m_isStatic = FALSE;
m_isTemplArg = FALSE;
m_membersMerged = FALSE;
m_categoryOf = 0;
QCString ns;
extractNamespaceName(name(),m_className,ns);
//printf("m_name=%s m_className=%s ns=%s\n",m_name.data(),m_className.data(),ns.data());
if (((QCString)defFileName).right(5)!=".java" &&
guessSection(defFileName)==Entry::SOURCE_SEC)
{
m_isLocal=TRUE;
}
else
{
m_isLocal=FALSE;
}
#endif
}
// destroy the class definition
ClassDef::~ClassDef()
{
#if 0
delete m_inherits;
delete m_inheritedBy;
delete m_allMemberNameInfoSDict;
delete m_exampleSDict;
delete m_usesImplClassDict;
delete m_usedByImplClassDict;
delete m_usesIntfClassDict;
delete m_incInfo;
delete memberGroupSDict;
delete m_innerClasses;
delete m_templateInstances;
delete m_variableInstances;
delete m_templBaseClassNames;
delete m_tempArgs;
#endif
delete m_impl;
}
......@@ -3080,6 +3016,11 @@ MemberDef *ClassDef::getMemberByName(const QCString &name) const
return xmd;
}
bool ClassDef::isAccessibleMember(MemberDef *md)
{
return md->getClassDef() && isBaseClass(md->getClassDef(),TRUE);
}
MemberList *ClassDef::createMemberList(MemberList::ListType lt)
{
m_impl->memberLists.setAutoDelete(TRUE);
......@@ -3321,3 +3262,13 @@ void ClassDef::setCategoryOf(ClassDef *cd)
m_impl->categoryOf = cd;
}
void ClassDef::setUsedOnly(bool b)
{
m_impl->usedOnly = b;
}
bool ClassDef::isUsedOnly() const
{
return m_impl->usedOnly;
}
......@@ -188,6 +188,11 @@ class ClassDef : public Definition
*/
bool isBaseClass(ClassDef *bcd,bool followInstances,int level=0);
/*! returns TRUE iff \a md is a member of this class or of the
* the public/protected members of a base class
*/
bool isAccessibleMember(MemberDef *md);
/*! Returns a sorted dictionary with all template instances found for
* this template class. Returns 0 if not a template or no instances.
*/
......@@ -258,6 +263,8 @@ class ClassDef : public Definition
ClassDef *getVariableInstance(const char *templSpec);
bool isUsedOnly() const;
//-----------------------------------------------------------------------------------
// --- setters ----
//-----------------------------------------------------------------------------------
......@@ -290,6 +297,7 @@ class ClassDef : public Definition
void addMembersToTemplateInstance(ClassDef *cd,const char *templSpec);
void makeTemplateArgument(bool b=TRUE);
void setCategoryOf(ClassDef *cd);
void setUsedOnly(bool b);
//-----------------------------------------------------------------------------------
// --- actions ----
......
......@@ -798,7 +798,7 @@ static bool getLinkInScope(const QCString &c, // scope
FileDef *fd;
NamespaceDef *nd;
GroupDef *gd;
//printf("Trying `%s'::`%s'\n",c.data(),m.data());
//printf("getLinkInScope: trying `%s'::`%s'\n",c.data(),m.data());
if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) &&
md->isLinkable())
{
......@@ -851,6 +851,7 @@ static bool getLink(const char *className,
CodeOutputInterface &ol,
const char *text=0)
{
//printf("getLink(%s,%s)\n",className,memberName);
QCString m=removeRedundantWhiteSpace(memberName);
QCString c=className;
if (!getLinkInScope(c,m,memberName,ol,text))
......
This diff is collapsed.
......@@ -34,7 +34,6 @@
#include "section.h"
#include "htags.h"
#include "parserintf.h"
#include "objcache.h"
#include "marshal.h"
#if defined(_MSC_VER) || defined(__BORLANDC__)
......@@ -237,14 +236,11 @@ Definition::Definition(const char *df,int dl,
const char *name,const char *b,
const char *d,bool isSymbol)
{
m_storagePos=-1;
m_name = name;
m_impl = new DefinitionImpl;
m_impl->init(df,dl,name,b,d);
m_isSymbol = isSymbol;
if (isSymbol) addToMap(name,this);
m_cacheHandle=-1;
m_flushPending = FALSE;
}
Definition::~Definition()
......@@ -258,11 +254,6 @@ Definition::~Definition()
delete m_impl;
m_impl=0;
}
if (m_cacheHandle!=-1)
{
Doxygen::symbolCache->del(m_cacheHandle);
m_cacheHandle=-1;
}
}
void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
......@@ -1173,74 +1164,14 @@ void Definition::setLocalName(const QCString name)
}
void Definition::makeResident() const
{
if (m_cacheHandle==-1) // not yet in cache
{
Definition *victim = 0;
Definition *that = (Definition*)this; // fake method constness
that->m_cacheHandle = Doxygen::symbolCache->add(that,(void **)&victim);
//printf("adding %s to cache, handle=%d\n",m_impl->name.data(),that->m_cacheHandle);
if (victim) // cache was full, victim was the least recently used item and has to go
{
victim->m_cacheHandle=-1; // invalidate cache handle
victim->saveToDisk(); // store the item on disk
}
else // cache not yet full
{
//printf("Adding %s to cache, handle=%d\n",m_impl->name.data(),m_cacheHandle);
}
if (m_storagePos!=-1) // already been written to disk
{
if (isLocked()) // locked in memory
{
assert(m_impl!=0);
that->m_flushPending=FALSE; // no need to flush anymore
}
else // not locked in memory
{
assert(m_impl==0);
loadFromDisk();
}
}
}
else // already cached, make this object the most recently used.
{
assert(m_impl!=0);
//printf("Touching symbol %s\n",m_impl->name.data());
Doxygen::symbolCache->use(m_cacheHandle);
}
}
void Definition::saveToDisk() const
{
assert(m_impl!=0);
Definition *that = (Definition *)this;
if (isLocked()) // cannot flush the item as it is locked
{
that->m_flushPending=TRUE; // flush when unlocked
}
else // ready to flush the item to disk
{
//printf("Adding %s to cache, handle=%d by replacing %s\n",
// m_impl->name.data(),m_cacheHandle,victim->m_impl->name.data());
if (m_storagePos!=-1)
// if victim was stored on disk already and is not locked
{
// free the storage space occupied by the old store item
Doxygen::symbolStorage->release(m_storagePos); // free up space for others
}
// write a the new (possibly modified) instance to disk
flushToDisk();
// end to write sequence (unless nothing was written due to the lock)
Doxygen::symbolStorage->end();
}
}
void Definition::flushToDisk() const
{
//printf("%p: Definition::flushToDisk()\n",this);
Definition *that = (Definition *)this;
that->m_storagePos = Doxygen::symbolStorage->alloc();
//printf("Definition::flushToDisk(): pos=%d\n",(int)m_storagePos);
marshalUInt(Doxygen::symbolStorage,START_MARKER);
marshalSectionDict (Doxygen::symbolStorage,m_impl->sectionDict);
......@@ -1262,7 +1193,6 @@ void Definition::flushToDisk() const
marshalUInt(Doxygen::symbolStorage,END_MARKER);
delete that->m_impl;
that->m_impl = 0;
that->m_flushPending=FALSE;
}
void Definition::loadFromDisk() const
......@@ -1271,7 +1201,6 @@ void Definition::loadFromDisk() const
Definition *that = (Definition *)this;
assert(m_impl==0);
that->m_impl = new DefinitionImpl;
Doxygen::symbolStorage->seek(m_storagePos);
uint marker = unmarshalUInt(Doxygen::symbolStorage);
assert(marker==START_MARKER);
m_impl->sectionDict = unmarshalSectionDict (Doxygen::symbolStorage);
......@@ -1294,18 +1223,3 @@ void Definition::loadFromDisk() const
assert(marker==END_MARKER);
}
void Definition::lock() const
{
}
void Definition::unlock() const
{
if (m_flushPending && !isLocked())
{
// write a the new (possibly modified) instance to disk
flushToDisk();
// end to write sequence (unless nothing was written due to the lock)
Doxygen::symbolStorage->end();
}
}
......@@ -279,19 +279,14 @@ class Definition : public DefinitionIntf, public LockableObj
virtual void flushToDisk() const;
virtual void loadFromDisk() const;
void makeResident() const;
bool isResident() const
{
return m_cacheHandle!=-1;
}
virtual void makeResident() const;
void lock() const {}
void unlock() const {}
private:
void lock() const;
void unlock() const;
static void addToMap(const char *name,Definition *d);
static void removeFromMap(Definition *d);
void saveToDisk() const;
void _setSymbolName(const QCString &name);
......@@ -299,10 +294,7 @@ class Definition : public DefinitionIntf, public LockableObj
void _writeSourceRefList(OutputList &ol,const char *scopeName,
const QCString &text,MemberSDict *members,bool);
DefinitionImpl *m_impl; // internal structure holding all private data
off_t m_storagePos; // location where the item is stored in file (if impl==0)
int m_cacheHandle;
QCString m_name;
bool m_flushPending;
bool m_isSymbol;
QCString m_symbolName;
......
......@@ -339,6 +339,7 @@ static void checkUndocumentedParams()
}
if (found)
{
bool first=TRUE;
QString errMsg=
"Warning: The following parameters of "+
QString(g_memberDef->qualifiedName()) +
......@@ -349,7 +350,15 @@ static void checkUndocumentedParams()
QString argName = g_memberDef->isDefine() ? a->type : a->name;
if (!argName.isEmpty() && g_paramsFound.find(argName)==0)
{
errMsg+=" parameter "+argName+"\n";
if (!first)
{
errMsg+="\n";
}
else
{
first=FALSE;
}
errMsg+=" parameter "+argName;
}
}
if (g_memberDef->inheritsDocsFrom())
......
This diff is collapsed.
......@@ -59,11 +59,13 @@ class StringDict : public QDict<QCString>
struct LookupInfo
{
LookupInfo(ClassDef *cd=0,MemberDef *td=0,QCString ts="")
: classDef(cd), typeDef(td), templSpec(ts) {}
LookupInfo() : classDef(0), typeDef(0) {}
LookupInfo(ClassDef *cd,MemberDef *td,QCString ts,QCString rt)
: classDef(cd), typeDef(td), templSpec(ts),resolvedType(rt) {}
ClassDef *classDef;
MemberDef *typeDef;
QCString templSpec;
QCString resolvedType;
};
extern QCString spaces;
......
......@@ -93,6 +93,7 @@ FileDef::FileDef(const char *p,const char *nm,
m_isJava = name().right(5)==".java";
memberGroupSDict = 0;
acquireFileVersion();
m_subGrouping=Config_getBool("SUBGROUPING");
}
/*! destroy the file definition */
......@@ -491,7 +492,8 @@ void FileDef::writeDocumentation(OutputList &ol)
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
if (mg->header()!="[NOHEADER]")
if ((!mg->allMembersInSameSection() || !m_subGrouping)
&& mg->header()!="[NOHEADER]")
{
mg->writeDeclarations(ol,0,0,this,0);
}
......@@ -689,6 +691,21 @@ void FileDef::addMembersToMemberGroup()
::addMembersToMemberGroup(ml,&memberGroupSDict,this);
}
}
// add members inside sections to their groups
if (memberGroupSDict)
{
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
if (mg->allMembersInSameSection() && m_subGrouping)
{
//printf("----> addToDeclarationSection(%s)\n",mg->header().data());
mg->addToDeclarationSection();
}
}
}
}
/*! Adds member definition \a md to the list of all members of this file */
......@@ -1363,6 +1380,7 @@ void FileDef::addMemberToList(MemberList::ListType lt,MemberDef *md)
{
ml->setInFile(TRUE);
}
if (ml->listType()&MemberList::declarationLists) md->setSectionList(this,ml);
}
MemberList *FileDef::getMemberList(MemberList::ListType lt) const
......
......@@ -214,6 +214,7 @@ class FileDef : public Definition
MemberGroupSDict *memberGroupSDict;
NamespaceSDict *namespaceSDict;
ClassSDict *classSDict;
bool m_subGrouping;
};
......
......@@ -37,20 +37,15 @@ class LockableObj
/*! Returns TRUE if the object is currently locked. */
bool isLocked() const { return m_lockCount>0; }
#ifndef _WIN32
protected:
#endif
/*! Called when the object is locked. */
virtual void lock() const = 0;
/*! Called when the object is unlocked. */
virtual void unlock() const = 0;
#ifndef _WIN32 // HACK: VC++ 6.0 does not understand friend template classes.
private:
template<class T> friend class LockingPtr;
#endif
int m_lockCount;
};
......
......@@ -7,17 +7,17 @@
#include "store.h"
class ArgumentList;
class BaseInfo;
class Grouping;
class SectionInfo;
class ListItemInfo;
struct BaseInfo;
struct Grouping;
struct SectionInfo;
struct ListItemInfo;
class QCString;
class QGString;
class SectionDict;
class MemberSDict;
class GroupList;
class BodyInfo;
class DocInfo;
struct BodyInfo;
struct DocInfo;
class MemberList;
class ExampleSDict;
......
......@@ -37,6 +37,7 @@
#include "searchindex.h"
#include "parserintf.h"
#include "marshal.h"
#include "objcache.h"
#define START_MARKER 0x4D454D5B // MEM[
#define END_MARKER 0x4D454D5D // MEM]
......@@ -367,6 +368,7 @@ class MemberDefImpl
bool isTypedefValCached;
ClassDef *cachedTypedefValue;
QCString cachedTypedefTemplSpec;
QCString cachedResolvedType;
// inbody documentation
int inbodyLine;
......@@ -574,8 +576,11 @@ MemberDef::MemberDef(const char *df,int dl,
const ArgumentList *tal,const ArgumentList *al
) : Definition(df,dl,removeRedundantWhiteSpace(na))
{
m_storagePos=-1;
m_cacheHandle=-1;
m_impl = new MemberDefImpl;
m_impl->init(this,t,a,e,p,v,s,r,mt,tal,al);
m_flushPending = FALSE;
#if 0
//printf("++++++ MemberDef(%s file=%s,line=%d static=%d) ++++++ \n",
......@@ -697,6 +702,11 @@ MemberDef::MemberDef(const char *df,int dl,
MemberDef::~MemberDef()
{
delete m_impl;
if (m_cacheHandle!=-1)
{
Doxygen::symbolCache->del(m_cacheHandle);
m_cacheHandle=-1;
}
}
void MemberDef::setReimplements(MemberDef *md)
......@@ -774,7 +784,10 @@ QCString MemberDef::getOutputFileBase() const
makeResident();
static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
QCString baseName;
if (m_impl->explicitOutputFileBase)
//printf("Member: %s: templateMaster=%p group=%p classDef=%p nspace=%p fileDef=%p\n",
// name().data(),m_impl->templateMaster,m_impl->group,m_impl->classDef,
// m_impl->nspace,m_impl->fileDef);
if (!m_impl->explicitOutputFileBase.isEmpty())
{
return m_impl->explicitOutputFileBase;
}
......@@ -805,6 +818,7 @@ QCString MemberDef::getOutputFileBase() const
"Warning: Internal inconsistency: member %s does not belong to any"
" container!",name().data()
);
exit(1);
return "dummy";
}
else if (separateMemberPages)
......@@ -3375,6 +3389,12 @@ QCString MemberDef::getCachedTypedefTemplSpec() const
return m_impl->cachedTypedefTemplSpec;
}
QCString MemberDef::getCachedResolvedTypedef() const
{
makeResident();
return m_impl->cachedResolvedType;
}
MemberDef *MemberDef::memberDefinition() const
{
makeResident();
......@@ -3591,21 +3611,24 @@ void MemberDef::setMemberDeclaration(MemberDef *md)
m_impl->memDec=md;
}
void MemberDef::cacheTypedefVal(ClassDef*val, QCString const& templSpec)
void MemberDef::cacheTypedefVal(ClassDef*val, const QCString & templSpec, const QCString &resolvedType)
{
makeResident();
m_impl->isTypedefValCached=TRUE;
m_impl->cachedTypedefValue=val;
m_impl->cachedTypedefTemplSpec=templSpec;
m_impl->cachedResolvedType=resolvedType;
}
void MemberDef::flushToDisk() const
{
if (isLocked()) return;
MemberDef *that = (MemberDef*)this;
that->m_storagePos = Doxygen::symbolStorage->alloc();
//printf("%p: MemberDef::flushToDisk()\n",this);
// write the definition base class member variables to disk
Definition::flushToDisk();
if (isLocked()) return;
//printf("%p: flushing specific part\n",this);
// write the memberdef member variables to disk
......@@ -3658,6 +3681,7 @@ void MemberDef::flushToDisk() const
marshalBool (Doxygen::symbolStorage,m_impl->isTypedefValCached);
marshalObjPointer (Doxygen::symbolStorage,m_impl->cachedTypedefValue);
marshalQCString (Doxygen::symbolStorage,m_impl->cachedTypedefTemplSpec);
marshalQCString (Doxygen::symbolStorage,m_impl->cachedResolvedType);
marshalInt (Doxygen::symbolStorage,m_impl->inbodyLine);
marshalQCString (Doxygen::symbolStorage,m_impl->inbodyFile);
marshalQCString (Doxygen::symbolStorage,m_impl->inbodyDocs);
......@@ -3682,25 +3706,27 @@ void MemberDef::flushToDisk() const
marshalUInt(Doxygen::symbolStorage,END_MARKER);
// function doesn't modify the object conceptually but compiler doesn't know this.
MemberDef *that = (MemberDef *)this;
delete that->m_impl;
that->m_impl=0;
that->m_flushPending=FALSE;
}
void MemberDef::loadFromDisk() const
{
//printf("%p: MemberDef::loadFromDisk()\n",this);
Definition::loadFromDisk();
MemberDef *that = (MemberDef *)this;
if (isLocked())
{
assert(m_impl!=0);
return;
}
assert(m_impl==0);
Doxygen::symbolStorage->seek(m_storagePos);
Definition::loadFromDisk();
//printf("%p: loading specific part\n",this);
MemberDef *that = (MemberDef *)this;
that->m_impl = new MemberDefImpl;
uint marker = unmarshalUInt(Doxygen::symbolStorage);
......@@ -3753,6 +3779,7 @@ void MemberDef::loadFromDisk() const
m_impl->isTypedefValCached = unmarshalBool (Doxygen::symbolStorage);
m_impl->cachedTypedefValue = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage);
m_impl->cachedTypedefTemplSpec = unmarshalQCString (Doxygen::symbolStorage);
m_impl->cachedResolvedType = unmarshalQCString (Doxygen::symbolStorage);
m_impl->inbodyLine = unmarshalInt (Doxygen::symbolStorage);
m_impl->inbodyFile = unmarshalQCString (Doxygen::symbolStorage);
m_impl->inbodyDocs = unmarshalQCString (Doxygen::symbolStorage);
......@@ -3778,3 +3805,84 @@ void MemberDef::loadFromDisk() const
assert(marker==END_MARKER);
}
void MemberDef::makeResident() const
{
if (m_cacheHandle==-1) // not yet in cache
{
MemberDef *victim = 0;
MemberDef *that = (MemberDef*)this; // fake method constness
that->m_cacheHandle = Doxygen::symbolCache->add(that,(void **)&victim);
//printf("adding %s to cache, handle=%d\n",m_impl->name.data(),that->m_cacheHandle);
if (victim) // cache was full, victim was the least recently used item and has to go
{
victim->m_cacheHandle=-1; // invalidate cache handle
victim->saveToDisk(); // store the item on disk
}
else // cache not yet full
{
//printf("Adding %s to cache, handle=%d\n",m_impl->name.data(),m_cacheHandle);
}
if (m_storagePos!=-1) // already been written to disk
{
if (isLocked()) // locked in memory
{
assert(m_impl!=0);
that->m_flushPending=FALSE; // no need to flush anymore
}
else // not locked in memory
{
assert(m_impl==0);
loadFromDisk();
}
}
}
else // already cached, make this object the most recently used.
{
assert(m_impl!=0);
//printf("Touching symbol %s\n",m_impl->name.data());
Doxygen::symbolCache->use(m_cacheHandle);
}
}
void MemberDef::saveToDisk() const
{
assert(m_impl!=0);
MemberDef *that = (MemberDef *)this;
if (isLocked()) // cannot flush the item as it is locked
{
that->m_flushPending=TRUE; // flush when unlocked
}
else // ready to flush the item to disk
{
//printf("Adding %s to cache, handle=%d by replacing %s\n",
// m_impl->name.data(),m_cacheHandle,victim->m_impl->name.data());
if (m_storagePos!=-1)
// if victim was stored on disk already and is not locked
{
// free the storage space occupied by the old store item
Doxygen::symbolStorage->release(m_storagePos); // free up space for others
}
// write a the new (possibly modified) instance to disk
flushToDisk();
// end to write sequence (unless nothing was written due to the lock)
Doxygen::symbolStorage->end();
}
}
void MemberDef::lock() const
{
}
void MemberDef::unlock() const
{
if (m_flushPending && !isLocked())
{
// write a the new (possibly modified) instance to disk
flushToDisk();
// end to write sequence (unless nothing was written due to the lock)
Doxygen::symbolStorage->end();
}
}
......@@ -209,6 +209,7 @@ class MemberDef : public Definition
bool isTypedefValCached() const;
ClassDef *getCachedTypedefVal() const;
QCString getCachedTypedefTemplSpec() const;
QCString getCachedResolvedTypedef() const;
MemberDef *memberDefinition() const;
MemberDef *memberDeclaration() const;
......@@ -294,7 +295,7 @@ class MemberDef : public Definition
void setDocsForDefinition(bool b);
void setGroupAlias(MemberDef *md);
void cacheTypedefVal(ClassDef *val,const QCString &templSpec);
void cacheTypedefVal(ClassDef *val,const QCString &templSpec,const QCString &resolvedType);
void invalidateTypedefValCache();
// declaration <-> definition relation
......@@ -330,6 +331,11 @@ class MemberDef : public Definition
void flushToDisk() const;
void loadFromDisk() const;
private:
void lock() const;
void unlock() const;
void saveToDisk() const;
void makeResident() const;
static int s_indentLevel;
// disable copying of member defs
MemberDef(const MemberDef &);
......@@ -340,6 +346,9 @@ class MemberDef : public Definition
bool onlyText=FALSE);
MemberDefImpl *m_impl;
int m_cacheHandle;
off_t m_storagePos; // location where the item is stored in file (if impl==0)
bool m_flushPending;
};
#endif
......@@ -133,6 +133,7 @@ void MemberGroup::addToDeclarationSection()
{
if (inDeclSection)
{
//printf("Adding group %p to list %p\n",this,inDeclSection);
inDeclSection->addMemberGroup(this);
}
}
......
......@@ -316,7 +316,8 @@ void MemberList::writeDeclarations(OutputList &ol,
//printf("----- writeDeclaration() ----\n");
countDecMembers(showEnumValues); // count member not in group
if (numDecMembers()==0) return;
//printf("MemberList::writeDeclaration(title=`%s',subtitle=`%s')=%d\n",title,subtitle,numDecMembers());
//printf("%p: MemberList::writeDeclaration(title=`%s',subtitle=`%s')=%d\n",
// this,title,subtitle,numDecMembers());
if (title)
{
ol.startMemberHeader();
......
......@@ -51,6 +51,7 @@ NamespaceDef::NamespaceDef(const char *df,int dl,
memberGroupSDict = new MemberGroupSDict;
memberGroupSDict->setAutoDelete(TRUE);
visited=FALSE;
m_subGrouping=Config_getBool("SUBGROUPING");
}
NamespaceDef::~NamespaceDef()
......@@ -151,6 +152,21 @@ void NamespaceDef::addMembersToMemberGroup()
::addMembersToMemberGroup(ml,&memberGroupSDict,this);
}
}
// add members inside sections to their groups
if (memberGroupSDict)
{
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
if (mg->allMembersInSameSection() && m_subGrouping)
{
//printf("----> addToDeclarationSection(%s)\n",mg->header().data());
mg->addToDeclarationSection();
}
}
}
}
void NamespaceDef::insertMember(MemberDef *md)
......@@ -316,11 +332,18 @@ void NamespaceDef::writeDocumentation(OutputList &ol)
namespaceSDict->writeDeclaration(ol,TRUE);
/* write user defined member groups */
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
if (memberGroupSDict)
{
mg->writeDeclarations(ol,0,this,0,0);
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
if ((!mg->allMembersInSameSection() || !m_subGrouping)
&& mg->header()!="[NOHEADER]")
{
mg->writeDeclarations(ol,0,this,0,0);
}
}
}
writeMemberDeclarations(ol,MemberList::decDefineMembers,theTranslator->trDefines());
......@@ -676,6 +699,7 @@ void NamespaceDef::addMemberToList(MemberList::ListType lt,MemberDef *md)
ml->inSort(md);
else
ml->append(md);
if (ml->listType()&MemberList::declarationLists) md->setSectionList(this,ml);
}
MemberList *NamespaceDef::getMemberList(MemberList::ListType lt) const
......
......@@ -106,7 +106,7 @@ class NamespaceDef : public Definition
MemberGroupSDict *memberGroupSDict;
ClassSDict *classSDict;
NamespaceSDict *namespaceSDict;
bool m_subGrouping;
};
class NamespaceList : public QList<NamespaceDef>
......
......@@ -176,16 +176,31 @@ void ObjCache::moveToFront(int index)
unsigned int ObjCache::hash(void *addr)
{
// Thomas Wang's 32 bit Mix Function
static bool isPtr64 = sizeof(addr)==8 && sizeof(long)==8;
// TODO: what if sizeof(void*)!=4 ?
unsigned int key = (unsigned int)addr;
key += ~(key << 15);
key ^= (key >> 10);
key += (key << 3);
key ^= (key >> 6);
key += ~(key << 11);
key ^= (key >> 16);
unsigned long key = (unsigned long)addr;
if (isPtr64)
{
// Thomas Wang's 64 bit Mix Function
key += ~(key << 32);
key ^= (key >> 22);
key += ~(key << 13);
key ^= (key >> 8);
key += (key << 3);
key ^= (key >> 15);
key += ~(key << 27);
key ^= (key >> 31);
}
else
{
// Thomas Wang's 32 bit Mix Function
key += ~(key << 15);
key ^= (key >> 10);
key += (key << 3);
key ^= (key >> 6);
key += ~(key << 11);
key ^= (key >> 16);
}
return key & (m_size-1);
}
......
......@@ -69,6 +69,7 @@ struct FileState
static int g_yyLineNr = 1;
static QCString g_yyFileName;
static FileDef *g_yyFileDef;
static FileDef *g_inputFileDef;
static int g_ifcount = 0;
static QStrList *g_pathList = 0;
static QStack<FileState> g_includeStack;
......@@ -1043,17 +1044,13 @@ void addDefine()
}
md->setInitializer(g_defLitText.stripWhiteSpace());
//md->setDefFile(g_yyFileName);
//md->setDefLine(g_yyLineNr);
md->setFileDef(g_yyFileDef);
md->setFileDef(g_inputFileDef);
md->setDefinition("#define "+g_defName);
MemberName *mn=Doxygen::functionNameSDict->find(g_defName);
if (mn==0)
{
mn = new MemberName(g_defName);
//Doxygen::functionNameList.append(mn);
//Doxygen::functionNameDict.insert(g_defName,mn);
Doxygen::functionNameSDict->append(g_defName,mn);
}
mn->append(md);
......@@ -1790,6 +1787,12 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
g_insideComment=FALSE;
BEGIN(DefineText);
}
<DefineArg>"..." { // Variadic macro
g_defVarArgs = TRUE;
g_defArgsStr+=yytext;
g_argDict->insert("__VA_ARGS__",new int(g_defArgs));
g_defArgs++;
}
<DefineArg>{ID}{B}*("..."?) {
//printf("Define addArg(%s)\n",yytext);
QCString argName=yytext;
......@@ -2372,6 +2375,7 @@ void preprocessFile(const char *fileName,BufStr &output)
g_level = 0;
g_ifcount = 0;
setFileName(fileName);
g_inputFileDef = g_yyFileDef;
BEGIN( Start );
g_lastGuardName.resize(0);
......
......@@ -29,7 +29,7 @@
#ifndef TRANSLATOR_JP_H
#define TRANSLATOR_JP_H
class TranslatorJapanese : public TranslatorAdapter_1_4_6
class TranslatorJapanese : public Translator
{
private:
/*! The decode() can change euc into sjis */
......@@ -453,12 +453,6 @@ class TranslatorJapanese : public TranslatorAdapter_1_4_6
virtual QCString trEnumerationTypeDocumentation()
{ return decode("列挙型"); }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration values
*/
virtual QCString trEnumerationValueDocumentation()
{ return decode("列挙型の値"); }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for functions
*/
......@@ -1562,5 +1556,23 @@ class TranslatorJapanese : public TranslatorAdapter_1_4_6
"利便性のために用意されています。"
"元の関数との違いは引き数のみです。");
}
//////////////////////////////////////////////////////////////////////////
// new since 1.4.6
//////////////////////////////////////////////////////////////////////////
/*! This is used to introduce a caller (or called-by) graph */
virtual QCString trCallerGraph()
{
// return "Here is the caller graph for this function:";
return "呼出しグラフ:";
}
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration values
*/
virtual QCString trEnumerationValueDocumentation()
{ return "列挙型"; }
};
#endif
This diff is collapsed.
......@@ -175,7 +175,8 @@ ClassDef *getResolvedClass(Definition *scope,
MemberDef **pTypeDef=0,
QCString *pTemplSpec=0,
bool mayBeUnlinkable=FALSE,
bool mayBeHidden=FALSE);
bool mayBeHidden=FALSE,
QCString *pResolvedType=0);
NamespaceDef *getResolvedNamespace(const char *key);
......@@ -326,7 +327,8 @@ SrcLangExt getLanguageFromFileName(const QCString fileName);
bool checkIfTypedef(Definition *scope,FileDef *fileScope,const char *n);
ClassDef *newResolveTypedef(FileDef *fileScope,MemberDef *md,
MemberDef **pMemType=0,QCString *pTemplSpec=0);
MemberDef **pMemType=0,QCString *pTemplSpec=0,
QCString *pResolvedType=0);
#endif
......

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual C++ Express 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Doxygen", "Doxygen.vcproj", "{309C9A4A-94D2-4837-9A11-45B0A6CF35C3}"
ProjectSection(ProjectDependencies) = postProject
{2543196E-6FC5-4D6A-96A8-91443CF7B21B} = {2543196E-6FC5-4D6A-96A8-91443CF7B21B}
{B6BB4771-8A4E-4656-AC08-1EF8AC182F64} = {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}
{FC8F6EAD-29A5-42A7-A646-B775F67CD7A3} = {FC8F6EAD-29A5-42A7-A646-B775F67CD7A3}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Doxytag", "Doxytag.vcproj", "{EE0E8466-1E25-4FBC-B273-5EA6776EFE95}"
ProjectSection(ProjectDependencies) = postProject
{B6BB4771-8A4E-4656-AC08-1EF8AC182F64} = {B6BB4771-8A4E-4656-AC08-1EF8AC182F64}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libpng", "libpng.vcproj", "{2543196E-6FC5-4D6A-96A8-91443CF7B21B}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "qtools", "qtools.vcproj", "{B6BB4771-8A4E-4656-AC08-1EF8AC182F64}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlib", "zlib.vcproj", "{FC8F6EAD-29A5-42A7-A646-B775F67CD7A3}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Doxywizard", "Doxywizard.vcproj", "{6E404596-D6B6-41A5-8F25-C52921A7C1BF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Debug|Win32.ActiveCfg = Debug|Win32
{309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Debug|Win32.Build.0 = Debug|Win32
{309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Release|Win32.ActiveCfg = Release|Win32
{309C9A4A-94D2-4837-9A11-45B0A6CF35C3}.Release|Win32.Build.0 = Release|Win32
{EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Debug|Win32.ActiveCfg = Debug|Win32
{EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Debug|Win32.Build.0 = Debug|Win32
{EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Release|Win32.ActiveCfg = Release|Win32
{EE0E8466-1E25-4FBC-B273-5EA6776EFE95}.Release|Win32.Build.0 = Release|Win32
{2543196E-6FC5-4D6A-96A8-91443CF7B21B}.Debug|Win32.ActiveCfg = Debug|Win32
{2543196E-6FC5-4D6A-96A8-91443CF7B21B}.Debug|Win32.Build.0 = Debug|Win32
{2543196E-6FC5-4D6A-96A8-91443CF7B21B}.Release|Win32.ActiveCfg = Release|Win32
{2543196E-6FC5-4D6A-96A8-91443CF7B21B}.Release|Win32.Build.0 = Release|Win32
{B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Debug|Win32.ActiveCfg = Debug|Win32
{B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Debug|Win32.Build.0 = Debug|Win32
{B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Release|Win32.ActiveCfg = Release|Win32
{B6BB4771-8A4E-4656-AC08-1EF8AC182F64}.Release|Win32.Build.0 = Release|Win32
{FC8F6EAD-29A5-42A7-A646-B775F67CD7A3}.Debug|Win32.ActiveCfg = Debug|Win32
{FC8F6EAD-29A5-42A7-A646-B775F67CD7A3}.Debug|Win32.Build.0 = Debug|Win32
{FC8F6EAD-29A5-42A7-A646-B775F67CD7A3}.Release|Win32.ActiveCfg = Release|Win32
{FC8F6EAD-29A5-42A7-A646-B775F67CD7A3}.Release|Win32.Build.0 = Release|Win32
{6E404596-D6B6-41A5-8F25-C52921A7C1BF}.Debug|Win32.ActiveCfg = Debug|Win32
{6E404596-D6B6-41A5-8F25-C52921A7C1BF}.Debug|Win32.Build.0 = Debug|Win32
{6E404596-D6B6-41A5-8F25-C52921A7C1BF}.Release|Win32.ActiveCfg = Release|Win32
{6E404596-D6B6-41A5-8F25-C52921A7C1BF}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
Name="Run Moc"
Version="8.00"
>
<Rules>
<CustomBuildRule
Name="moc"
DisplayName="Moc"
CommandLine="$(QTDIR)/bin/moc.exe $(InputPath) -o moc_$(InputName).cpp"
Outputs="moc_$(InputName).cpp"
AdditionalDependencies="$(QTDIR)/bin/moc.exe"
FileExtensions="*.h"
ExecutionDescription="Moc&apos;ing $(InputPath)"
>
<Properties>
</Properties>
</CustomBuildRule>
</Rules>
</VisualStudioToolFile>
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment