Commit b7473cd8 authored by Dimitri van Heesch's avatar Dimitri van Heesch

Release-1.3.8-20040928

parent a3133b16
DOXYGEN Version 1.3.8-20040913
DOXYGEN Version 1.3.8-20040928
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (13 September 2004)
Dimitri van Heesch (28 September 2004)
DOXYGEN Version 1.3.8_20040913
DOXYGEN Version 1.3.8_20040928
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) (13 September 2004)
Dimitri van Heesch (dimitri@stack.nl) (28 September 2004)
1.3.8-20040913
1.3.8-20040928
......@@ -33,6 +33,7 @@ class ICompound;
class ISection;
class INode;
class IDocInternal;
class IDocRoot;
/*! \brief Read only interface to a string.
*/
......@@ -51,6 +52,11 @@ class IString
virtual int length() const = 0;
};
/*! \brief Base interface for hyperlinked text
*
* Depending on the result of kind() the interface is extended by
* ILT_Text or ILT_Ref.
*/
class ILinkedText
{
public:
......@@ -58,12 +64,16 @@ class ILinkedText
virtual Kind kind() const = 0;
};
/*! \brief Plain text fragment.
*/
class ILT_Text : public ILinkedText
{
public:
virtual const IString *text() const = 0;
};
/*! \brief Reference to an object.
*/
class ILT_Ref : public ILinkedText
{
public:
......@@ -74,6 +84,8 @@ class ILT_Ref : public ILinkedText
virtual const IString *text() const = 0;
};
/*! \brief Iterates over a list of ILinkedText fragments.
*/
class ILinkedTextIterator
{
public:
......@@ -85,6 +97,7 @@ class ILinkedTextIterator
virtual void release() = 0;
};
/*! \brief Representation of a parameter of a function. */
class IParam
{
public:
......@@ -94,6 +107,7 @@ class IParam
virtual const IString * attrib() const = 0;
virtual const IString * arraySpecifier() const = 0;
virtual ILinkedTextIterator *defaultValue() const = 0;
virtual IDocRoot *briefDescription() const = 0;
};
class IParamIterator
......@@ -171,7 +185,8 @@ class IDoc
Anchor, // 34 -> IDocAnchor
Symbol, // 35 -> IDocSymbol
Internal, // 36 -> IDocInternal
Root // 37 -> IDocRoot
Root, // 37 -> IDocRoot
ParameterItem // 38 -> IDocParameterItem
};
virtual Kind kind() const = 0;
};
......@@ -238,15 +253,21 @@ class IDocParameterList : public IDoc
{
public:
enum Types { Param, RetVal, Exception };
virtual Types listType() const = 0;
virtual Types sectType() const = 0;
virtual IDocIterator *params() const = 0;
};
class IDocParameterItem : public IDoc
{
public:
virtual IDocIterator *paramNames() const = 0;
virtual IDocPara *description() const = 0;
};
class IDocParameter : public IDoc
{
public:
virtual const IString * name() const = 0;
virtual IDocPara *description() const = 0;
};
class IDocTitle : public IDoc
......@@ -562,8 +583,18 @@ class IMember
virtual ILinkedTextIterator *type() const = 0;
virtual const IString * typeString() const = 0;
virtual const IString * name() const = 0;
virtual const IString * readAccessor() const = 0;
virtual const IString * writeAccessor() const = 0;
virtual const IString * definition() const = 0;
virtual const IString * argsstring() const = 0;
virtual bool isConst() const = 0;
virtual bool isVolatile() const = 0;
virtual bool isStatic() const = 0;
virtual bool isExplicit() const = 0;
virtual bool isInline() const = 0;
virtual bool isMutable() const = 0;
virtual bool isReadable() const = 0;
virtual bool isWritable() const = 0;
virtual IParamIterator *parameters() const = 0;
virtual IParamIterator *templateParameters() const = 0;
virtual ILinkedTextIterator *initializer() const = 0;
......@@ -578,6 +609,7 @@ class IMember
virtual IMemberReferenceIterator *reimplementedBy() const = 0;
virtual IDocRoot *briefDescription() const = 0;
virtual IDocRoot *detailedDescription() const = 0;
virtual IDocRoot *inbodyDescription() const = 0;
};
class IDefine : public IMember
......@@ -636,19 +668,26 @@ class IEnumValue : public IMember
virtual const IString * name() const = 0;
};
#if 0
class IEnumValueIterator
/*! \brief Include relation
*/
class IInclude
{
public:
virtual IEnumValue *toFirst() = 0;
virtual IEnumValue *toLast() = 0;
virtual IEnumValue *toNext() = 0;
virtual IEnumValue *toPrev() = 0;
virtual IEnumValue *current() const = 0;
virtual void release() = 0;
virtual const IString * name() const = 0;
virtual const IString * refId() const = 0;
virtual bool isLocal() const = 0;
};
#endif
class IIncludeIterator
{
public:
virtual IInclude *toFirst() = 0;
virtual IInclude *toLast() = 0;
virtual IInclude *toNext() = 0;
virtual IInclude *toPrev() = 0;
virtual IInclude *current() const = 0;
virtual void release() = 0;
};
class IMemberIterator
{
......@@ -936,6 +975,7 @@ class IInterface : public ICompound
virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
};
/*! \brief The interface to a Java/IDL exception in the object model.
*/
class IException : public ICompound
......@@ -960,9 +1000,9 @@ class IFile : public ICompound
virtual IDocProgramListing *source() const = 0;
virtual ICompoundIterator *nestedCompounds() const = 0;
// file:
// includes()
// includedBy()
virtual IIncludeIterator *includes() const = 0;
virtual IIncludeIterator *includedBy() const = 0;
// ICompound *innerNamespaces()
// ICompoundIterator *innerClasses()
};
......
......@@ -25,6 +25,33 @@
//----------------------------------------------------------------------------
IncludeHandler::IncludeHandler(IBaseHandler *parent,const char *endtag) :
m_parent(parent)
{
addEndHandler(endtag,this,&IncludeHandler::endInclude);
}
IncludeHandler::~IncludeHandler()
{
}
void IncludeHandler::startInclude(const QXmlAttributes &attrib)
{
m_curString = "";
m_refId = attrib.value("refid");
m_isLocal = attrib.value("local")=="yes";
m_parent->setDelegate(this);
}
void IncludeHandler::endInclude()
{
m_name = m_curString;
m_parent->setDelegate(0);
debug(2,"Found include %s\n",m_name.data());
}
//----------------------------------------------------------------------------
class CompoundIdIterator : public ICompoundIterator,
public QListIterator<QString>
{
......@@ -107,11 +134,15 @@ class CompoundTypeMap
m_map.insert("struct",new int(ICompound::Struct));
m_map.insert("union",new int(ICompound::Union));
m_map.insert("interface",new int(ICompound::Interface));
m_map.insert("protocol",new int(ICompound::Interface));
m_map.insert("category",new int(ICompound::Interface));
m_map.insert("exception",new int(ICompound::Exception));
m_map.insert("namespace",new int(ICompound::Namespace));
m_map.insert("file",new int(ICompound::File));
m_map.insert("namespace",new int(ICompound::Namespace));
m_map.insert("group",new int(ICompound::Group));
m_map.insert("page",new int(ICompound::Page));
m_map.insert("example",new int(ICompound::Page));
m_map.insert("dir",new int(ICompound::Page));
}
virtual ~CompoundTypeMap()
{
......@@ -157,6 +188,8 @@ CompoundHandler::CompoundHandler(const QString &xmlDir)
m_memberNameDict.setAutoDelete(TRUE);
m_innerCompounds.setAutoDelete(TRUE);
m_params.setAutoDelete(TRUE);
m_includes.setAutoDelete(TRUE);
m_includedBy.setAutoDelete(TRUE);
addStartHandler("doxygen");
addEndHandler("doxygen");
......@@ -175,13 +208,16 @@ CompoundHandler::CompoundHandler(const QString &xmlDir)
addStartHandler("derivedcompoundref",this,&CompoundHandler::addSubClass);
addEndHandler("derivedcompoundref");
// includes
// includedby
addStartHandler("includes",this,&CompoundHandler::startIncludes);
addStartHandler("includedby",this,&CompoundHandler::startIncludedBy);
addStartHandler("incdepgraph",this,&CompoundHandler::startIncludeDependencyGraph);
addStartHandler("invincdepgraph",this,&CompoundHandler::startIncludedByDependencyGraph);
addStartHandler("innerdir",this,&CompoundHandler::startInnerDir);
addEndHandler("innerdir");
addStartHandler("innerfile",this,&CompoundHandler::startInnerFile);
addEndHandler("innerfile");
......@@ -191,7 +227,8 @@ CompoundHandler::CompoundHandler(const QString &xmlDir)
addStartHandler("innernamespace",this,&CompoundHandler::startInnerNamespace);
addEndHandler("innernamespace");
// innerpage
addStartHandler("innerpage",this,&CompoundHandler::startInnerPage);
addEndHandler("innerpage");
addStartHandler("innergroup",this,&CompoundHandler::startInnerGroup);
addEndHandler("innergroup");
......@@ -259,6 +296,20 @@ void CompoundHandler::startProgramListing(const QXmlAttributes& attrib)
m_programListing = plHandler;
}
void CompoundHandler::startIncludes(const QXmlAttributes& attrib)
{
IncludeHandler *inc = new IncludeHandler(this,"includes");
m_includes.append(inc);
inc->startInclude(attrib);
}
void CompoundHandler::startIncludedBy(const QXmlAttributes& attrib)
{
IncludeHandler *inc = new IncludeHandler(this,"includedby");
m_includedBy.append(inc);
inc->startInclude(attrib);
}
void CompoundHandler::startCompound(const QXmlAttributes& attrib)
{
m_id = attrib.value("id");
......@@ -307,6 +358,16 @@ void CompoundHandler::startInnerGroup(const QXmlAttributes& attrib)
m_innerCompounds.append(new QString(attrib.value("refid")));
}
void CompoundHandler::startInnerPage(const QXmlAttributes& attrib)
{
m_innerCompounds.append(new QString(attrib.value("refid")));
}
void CompoundHandler::startInnerDir(const QXmlAttributes& attrib)
{
m_innerCompounds.append(new QString(attrib.value("refid")));
}
void CompoundHandler::startTemplateParamList(const QXmlAttributes& attrib)
{
m_templateParamList = new TemplateParamListHandler(this);
......@@ -539,6 +600,16 @@ IDocProgramListing *CompoundHandler::source() const
return m_programListing;
}
IIncludeIterator *CompoundHandler::includes() const
{
return new IncludeIterator(m_includes);
}
IIncludeIterator *CompoundHandler::includedBy() const
{
return new IncludeIterator(m_includedBy);
}
IParamIterator *CompoundHandler::templateParameters() const
{
return m_templateParamList ? m_templateParamList->templateParams() : 0;
......
......@@ -36,6 +36,38 @@ class TemplateParamListHandler;
class TitleHandler;
class ListOfAllMembersHandler;
class IncludeHandler : public IInclude, public BaseHandler<IncludeHandler>\
{
public:
IncludeHandler(IBaseHandler *parent,const char *endtag);
virtual ~IncludeHandler();
void startInclude(const QXmlAttributes &attrib);
void endInclude();
// IInclude
virtual const IString * name() const
{ return &m_name; }
virtual const IString * refId() const
{ return &m_refId; }
virtual bool isLocal() const
{ return &m_isLocal; }
private:
IBaseHandler *m_parent;
StringImpl m_name;
StringImpl m_refId;
bool m_isLocal;
};
class IncludeIterator : public BaseIterator<IIncludeIterator,IInclude,IncludeHandler>
{
public:
IncludeIterator(const QList<IncludeHandler> &list) :
BaseIterator<IIncludeIterator,IInclude,IncludeHandler>(list) {}
};
class RelatedCompound : public IRelatedCompound
{
public:
......@@ -94,10 +126,14 @@ class CompoundHandler : public IClass,
virtual void startCollaborationGraph(const QXmlAttributes& attrib);
virtual void startIncludeDependencyGraph(const QXmlAttributes& attrib);
virtual void startIncludedByDependencyGraph(const QXmlAttributes& attrib);
virtual void startIncludes(const QXmlAttributes& attrib);
virtual void startIncludedBy(const QXmlAttributes& attrib);
virtual void startInnerDir(const QXmlAttributes& attrib);
virtual void startInnerClass(const QXmlAttributes& attrib);
virtual void startInnerNamespace(const QXmlAttributes& attrib);
virtual void startInnerFile(const QXmlAttributes& attrib);
virtual void startInnerGroup(const QXmlAttributes& attrib);
virtual void startInnerPage(const QXmlAttributes& attrib);
virtual void startTitle(const QXmlAttributes& attrib);
virtual void startTemplateParamList(const QXmlAttributes& attrib);
virtual void startListOfAllMembers(const QXmlAttributes& attrib);
......@@ -140,6 +176,8 @@ class CompoundHandler : public IClass,
IGraph *includeDependencyGraph() const;
IGraph *includedByDependencyGraph() const;
IDocProgramListing *source() const;
IIncludeIterator *includes() const;
IIncludeIterator *includedBy() const;
// IPage implementation
const IDocTitle *title() const;
......@@ -149,6 +187,8 @@ class CompoundHandler : public IClass,
QList<RelatedCompound> m_subClasses;
QList<SectionHandler> m_sections;
QList<ParamHandler> m_params;
QList<IncludeHandler> m_includes;
QList<IncludeHandler> m_includedBy;
DocHandler* m_brief;
DocHandler* m_detailed;
ProgramListingHandler* m_programListing;
......
......@@ -551,16 +551,13 @@ void TocItemHandler::endTocItem()
//----------------------------------------------------------------------
ParameterHandler::ParameterHandler(IBaseHandler *parent) :
m_parent(parent), m_description(0)
m_parent(parent)
{
addEndHandler("parametername",this,&ParameterHandler::endParameterName);
addEndHandler("parameterdescription",this,&ParameterHandler::endParameterDescription);
addStartHandler("para",this,&ParameterHandler::startParagraph);
}
ParameterHandler::~ParameterHandler()
{
delete m_description;
}
void ParameterHandler::startParameterName(const QXmlAttributes& /*attrib*/)
......@@ -576,23 +573,57 @@ void ParameterHandler::endParameterName()
m_parent->setDelegate(0);
}
void ParameterHandler::startParameterDescription(const QXmlAttributes& /*attrib*/)
//----------------------------------------------------------------------
// ParameterListHandler
//----------------------------------------------------------------------
ParameterItemHandler::ParameterItemHandler(IBaseHandler *parent)
: m_parent(parent)
{
addEndHandler("parameteritem",this,&ParameterItemHandler::endParameterItem);
addStartHandler("parameternamelist");
addEndHandler("parameternamelist");
addStartHandler("parametername",this,&ParameterItemHandler::startParameterName);
addStartHandler("parameterdescription");
addEndHandler("parameterdescription");
addStartHandler("para",this,&ParameterItemHandler::startParagraph);
m_parameters.setAutoDelete(TRUE);
m_description = 0;
}
ParameterItemHandler::~ParameterItemHandler()
{
delete m_description;
}
void ParameterItemHandler::startParameterItem(const QXmlAttributes&)
{
m_parent->setDelegate(this);
}
void ParameterHandler::endParameterDescription()
void ParameterItemHandler::endParameterItem()
{
m_parent->setDelegate(0);
}
void ParameterHandler::startParagraph(const QXmlAttributes& attrib)
void ParameterItemHandler::startParameterName(const QXmlAttributes& attrib)
{
ParameterHandler *param = new ParameterHandler(this);
m_parameters.append(param);
param->startParameterName(attrib);
}
void ParameterItemHandler::startParagraph(const QXmlAttributes& attrib)
{
ASSERT(m_description==0);
m_description = new ParagraphHandler(this);
m_description->startParagraph(attrib);
}
IDocIterator *ParameterItemHandler::paramNames() const
{
return new ParameterItemIterator(*this);
}
//----------------------------------------------------------------------
// ParameterListHandler
//----------------------------------------------------------------------
......@@ -601,12 +632,8 @@ ParameterListHandler::ParameterListHandler(IBaseHandler *parent)
: m_parent(parent)
{
addEndHandler("parameterlist",this,&ParameterListHandler::endParameterList);
addStartHandler("parametername",this,&ParameterListHandler::startParameterName);
addStartHandler("parameterdescription",this,&ParameterListHandler::startParameterDescription);
addStartHandler("title");
addEndHandler("title");
m_parameters.setAutoDelete(TRUE);
m_curParam=0;
addStartHandler("parameteritem",this,&ParameterListHandler::startParameterItem);
m_paramItems.setAutoDelete(TRUE);
}
ParameterListHandler::~ParameterListHandler()
......@@ -632,17 +659,11 @@ void ParameterListHandler::endParameterList()
m_parent->setDelegate(0);
}
void ParameterListHandler::startParameterName(const QXmlAttributes& attrib)
{
m_curParam = new ParameterHandler(this);
m_parameters.append(m_curParam);
m_curParam->startParameterName(attrib);
}
void ParameterListHandler::startParameterDescription(const QXmlAttributes& attrib)
void ParameterListHandler::startParameterItem(const QXmlAttributes& attrib)
{
ASSERT(m_curParam!=0);
m_curParam->startParameterDescription(attrib);
ParameterItemHandler *paramItem = new ParameterItemHandler(this);
m_paramItems.append(paramItem);
paramItem->startParameterItem(attrib);
}
IDocIterator *ParameterListHandler::params() const
......@@ -1734,9 +1755,9 @@ void ParagraphHandler::startOrderedList(const QXmlAttributes& attrib)
void ParagraphHandler::startParameterList(const QXmlAttributes& attrib)
{
addTextNode();
ParameterListHandler *parListHandler = new ParameterListHandler(this);
parListHandler->startParameterList(attrib);
m_children.append(parListHandler);
ParameterListHandler *listHandler = new ParameterListHandler(this);
listHandler->startParameterList(attrib);
m_children.append(listHandler);
}
void ParagraphHandler::startSimpleSect(const QXmlAttributes& attrib)
......@@ -2148,6 +2169,7 @@ DocHandler::DocHandler(IBaseHandler *parent) : m_parent(parent)
addEndHandler("briefdescription",this,&DocHandler::endDoc);
addEndHandler("detaileddescription",this,&DocHandler::endDoc);
addEndHandler("inbodydescription",this,&DocHandler::endDoc);
addEndHandler("internal");
addStartHandler("para",this,&DocHandler::startParagraph);
......
......@@ -45,6 +45,7 @@ DEFINE_CLS_IMPL(DocItemizedList);
DEFINE_CLS_IMPL(DocOrderedList);
DEFINE_CLS_IMPL(DocListItem);
DEFINE_CLS_IMPL(DocParameterList);
DEFINE_CLS_IMPL(DocParameterItem);
DEFINE_CLS_IMPL(DocParameter);
DEFINE_CLS_IMPL(DocTitle);
DEFINE_CLS_IMPL(DocSimpleSect);
......@@ -418,24 +419,54 @@ class ParameterHandler : public DocParameterImpl,
virtual ~ParameterHandler();
virtual void startParameterName(const QXmlAttributes& attrib);
virtual void endParameterName();
virtual void startParameterDescription(const QXmlAttributes& attrib);
virtual void endParameterDescription();
virtual void startParagraph(const QXmlAttributes& attrib);
// IDocParameter
virtual Kind kind() const { return DocImpl::Parameter; }
virtual const IString *name() const { return &m_name; }
virtual IDocPara *description() const { return m_description; }
private:
IBaseHandler *m_parent;
StringImpl m_name;
};
//-----------------------------------------------------------------------------
/* \brief Node representing a list of param names with a single description.
*
*/
class ParameterItemHandler : public DocParameterItemImpl,
public BaseHandler<ParameterItemHandler>
{
friend class ParameterItemIterator;
public:
ParameterItemHandler(IBaseHandler *parent);
virtual ~ParameterItemHandler();
virtual void startParameterItem(const QXmlAttributes& attrib);
virtual void endParameterItem();
virtual void startParameterName(const QXmlAttributes& attrib);
virtual void startParagraph(const QXmlAttributes& attrib);
// IDocParameterItem
virtual Kind kind() const { return DocImpl::ParameterItem; }
virtual IDocIterator *paramNames() const;
virtual IDocPara *description() const { return m_description; }
private:
IBaseHandler *m_parent;
QList<ParameterHandler> m_parameters;
ParagraphHandler *m_description;
};
class ParameterItemIterator : public BaseIteratorVia<IDocIterator,IDoc,ParameterHandler,DocImpl>
{
public:
ParameterItemIterator(const ParameterItemHandler &handler) :
BaseIteratorVia<IDocIterator,IDoc,ParameterHandler,DocImpl>(handler.m_parameters) {}
};
//-----------------------------------------------------------------------------
/* \brief Node representing a parameter list.
/* \brief Node representing a parameter section.
*
*/
class ParameterListHandler : public DocParameterListImpl,
......@@ -447,26 +478,24 @@ class ParameterListHandler : public DocParameterListImpl,
virtual ~ParameterListHandler();
virtual void startParameterList(const QXmlAttributes& attrib);
virtual void endParameterList();
virtual void startParameterName(const QXmlAttributes& attrib);
virtual void startParameterDescription(const QXmlAttributes& attrib);
virtual void startParameterItem(const QXmlAttributes& attrib);
// IDocParameterList
virtual Kind kind() const { return DocImpl::ParameterList; }
virtual Types listType() const { return m_type; }
virtual Types sectType() const { return m_type; }
virtual IDocIterator *params() const;
private:
IBaseHandler *m_parent;
QList<ParameterHandler> m_parameters;
ParameterHandler *m_curParam;
QList<ParameterItemHandler> m_paramItems;
Types m_type;
};
class ParameterListIterator : public BaseIteratorVia<IDocIterator,IDoc,ParameterHandler,DocImpl>
class ParameterListIterator : public BaseIteratorVia<IDocIterator,IDoc,ParameterItemHandler,DocImpl>
{
public:
ParameterListIterator(const ParameterListHandler &handler) :
BaseIteratorVia<IDocIterator,IDoc,ParameterHandler,DocImpl>(handler.m_parameters) {}
BaseIteratorVia<IDocIterator,IDoc,ParameterItemHandler,DocImpl>(handler.m_paramItems) {}
};
//-----------------------------------------------------------------------------
......
......@@ -33,6 +33,7 @@ class ICompound;
class ISection;
class INode;
class IDocInternal;
class IDocRoot;
/*! \brief Read only interface to a string.
*/
......@@ -51,6 +52,11 @@ class IString
virtual int length() const = 0;
};
/*! \brief Base interface for hyperlinked text
*
* Depending on the result of kind() the interface is extended by
* ILT_Text or ILT_Ref.
*/
class ILinkedText
{
public:
......@@ -58,12 +64,16 @@ class ILinkedText
virtual Kind kind() const = 0;
};
/*! \brief Plain text fragment.
*/
class ILT_Text : public ILinkedText
{
public:
virtual const IString *text() const = 0;
};
/*! \brief Reference to an object.
*/
class ILT_Ref : public ILinkedText
{
public:
......@@ -74,6 +84,8 @@ class ILT_Ref : public ILinkedText
virtual const IString *text() const = 0;
};
/*! \brief Iterates over a list of ILinkedText fragments.
*/
class ILinkedTextIterator
{
public:
......@@ -85,6 +97,7 @@ class ILinkedTextIterator
virtual void release() = 0;
};
/*! \brief Representation of a parameter of a function. */
class IParam
{
public:
......@@ -94,6 +107,7 @@ class IParam
virtual const IString * attrib() const = 0;
virtual const IString * arraySpecifier() const = 0;
virtual ILinkedTextIterator *defaultValue() const = 0;
virtual IDocRoot *briefDescription() const = 0;
};
class IParamIterator
......@@ -171,7 +185,8 @@ class IDoc
Anchor, // 34 -> IDocAnchor
Symbol, // 35 -> IDocSymbol
Internal, // 36 -> IDocInternal
Root // 37 -> IDocRoot
Root, // 37 -> IDocRoot
ParameterItem // 38 -> IDocParameterItem
};
virtual Kind kind() const = 0;
};
......@@ -238,15 +253,21 @@ class IDocParameterList : public IDoc
{
public:
enum Types { Param, RetVal, Exception };
virtual Types listType() const = 0;
virtual Types sectType() const = 0;
virtual IDocIterator *params() const = 0;
};
class IDocParameterItem : public IDoc
{
public:
virtual IDocIterator *paramNames() const = 0;
virtual IDocPara *description() const = 0;
};
class IDocParameter : public IDoc
{
public:
virtual const IString * name() const = 0;
virtual IDocPara *description() const = 0;
};
class IDocTitle : public IDoc
......@@ -562,8 +583,18 @@ class IMember
virtual ILinkedTextIterator *type() const = 0;
virtual const IString * typeString() const = 0;
virtual const IString * name() const = 0;
virtual const IString * readAccessor() const = 0;
virtual const IString * writeAccessor() const = 0;
virtual const IString * definition() const = 0;
virtual const IString * argsstring() const = 0;
virtual bool isConst() const = 0;
virtual bool isVolatile() const = 0;
virtual bool isStatic() const = 0;
virtual bool isExplicit() const = 0;
virtual bool isInline() const = 0;
virtual bool isMutable() const = 0;
virtual bool isReadable() const = 0;
virtual bool isWritable() const = 0;
virtual IParamIterator *parameters() const = 0;
virtual IParamIterator *templateParameters() const = 0;
virtual ILinkedTextIterator *initializer() const = 0;
......@@ -578,6 +609,7 @@ class IMember
virtual IMemberReferenceIterator *reimplementedBy() const = 0;
virtual IDocRoot *briefDescription() const = 0;
virtual IDocRoot *detailedDescription() const = 0;
virtual IDocRoot *inbodyDescription() const = 0;
};
class IDefine : public IMember
......@@ -636,19 +668,26 @@ class IEnumValue : public IMember
virtual const IString * name() const = 0;
};
#if 0
class IEnumValueIterator
/*! \brief Include relation
*/
class IInclude
{
public:
virtual IEnumValue *toFirst() = 0;
virtual IEnumValue *toLast() = 0;
virtual IEnumValue *toNext() = 0;
virtual IEnumValue *toPrev() = 0;
virtual IEnumValue *current() const = 0;
virtual void release() = 0;
virtual const IString * name() const = 0;
virtual const IString * refId() const = 0;
virtual bool isLocal() const = 0;
};
#endif
class IIncludeIterator
{
public:
virtual IInclude *toFirst() = 0;
virtual IInclude *toLast() = 0;
virtual IInclude *toNext() = 0;
virtual IInclude *toPrev() = 0;
virtual IInclude *current() const = 0;
virtual void release() = 0;
};
class IMemberIterator
{
......@@ -936,6 +975,7 @@ class IInterface : public ICompound
virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
};
/*! \brief The interface to a Java/IDL exception in the object model.
*/
class IException : public ICompound
......@@ -960,9 +1000,9 @@ class IFile : public ICompound
virtual IDocProgramListing *source() const = 0;
virtual ICompoundIterator *nestedCompounds() const = 0;
// file:
// includes()
// includedBy()
virtual IIncludeIterator *includes() const = 0;
virtual IIncludeIterator *includedBy() const = 0;
// ICompound *innerNamespaces()
// ICompoundIterator *innerClasses()
};
......
......@@ -133,6 +133,7 @@ void MainHandler::endName()
else
{
m_curCompound->name = m_curString;
m_compoundNameDict.insert(m_curString,m_curCompound);
}
}
......@@ -230,16 +231,16 @@ ICompound *MainHandler::compoundById(const char *id) const
// unchanged.
MainHandler *that = (MainHandler *)this;
ch->initialize(that);
printf("loading compound %s in memory\n",id);
//printf("loading compound %s in memory\n",id);
that->m_compoundsLoaded.insert(id,ch);
return ch->toICompound();
}
void MainHandler::unloadCompound(CompoundHandler *ch)
{
printf("unloading compound %s from memory\n",ch->id()->latin1());
//printf("unloading compound %s from memory\n",ch->id()->latin1());
bool result = m_compoundsLoaded.remove(ch->id()->latin1());
if (!result) printf("Failed to unload!\n");
if (!result) debug(1,"Failed to unload component!\n");
}
ICompound *MainHandler::compoundByName(const char *name) const
......@@ -257,7 +258,7 @@ ICompound *MainHandler::memberById(const char *id) const
if (ids.isEmpty()) return 0;
MemberEntry *me = m_memberDict[id];
if (me==0) return 0; // id not found
return compoundById(me->id);
return compoundById(me->compound->id);
}
ICompoundIterator *MainHandler::memberByName(const char *name) const
......
......@@ -154,7 +154,7 @@ void EnumValueHandler::startDetailedDesc(const QXmlAttributes& attrib)
//------------------------------------------------------------------------------
MemberHandler::MemberHandler(IBaseHandler *parent)
: m_parent(parent), m_compound(0), m_brief(0), m_detailed(0)
: m_parent(parent), m_compound(0), m_brief(0), m_detailed(0), m_inbody(0)
{
//printf("MemberHandler::MemberHandler() %p\n",this);
addEndHandler("memberdef",this,&MemberHandler::endMember);
......@@ -163,11 +163,22 @@ MemberHandler::MemberHandler(IBaseHandler *parent)
addEndHandler("templateparamlist",this,&MemberHandler::endTemplateParamList);
addStartHandler("type",this,&MemberHandler::startType);
// definition
// argsstring
addStartHandler("definition",this,&MemberHandler::startDefinition);
addEndHandler("definition",this,&MemberHandler::endDefinition);
addStartHandler("argsstring",this,&MemberHandler::startArgsString);
addEndHandler("argsstring",this,&MemberHandler::endArgsString);
addStartHandler("name",this,&MemberHandler::startName);
addEndHandler("name",this,&MemberHandler::endName);
addStartHandler("read",this,&MemberHandler::startRead);
addEndHandler("read",this,&MemberHandler::endRead);
addStartHandler("write",this,&MemberHandler::startWrite);
addEndHandler("write",this,&MemberHandler::endWrite);
addStartHandler("reimplements",this,&MemberHandler::startReimplements);
addEndHandler("reimplements",this,&MemberHandler::endReimplements);
......@@ -180,13 +191,13 @@ MemberHandler::MemberHandler(IBaseHandler *parent)
addEndHandler("enumvalue",this,&MemberHandler::endMember);
addStartHandler("initializer",this,&MemberHandler::startInitializer);
addStartHandler("exception",this,&MemberHandler::startException);
addStartHandler("exceptions",this,&MemberHandler::startException);
addStartHandler("briefdescription",this,&MemberHandler::startBriefDesc);
addStartHandler("detaileddescription",this,&MemberHandler::startDetailedDesc);
// inbodydescription
addStartHandler("inbodydescription",this,&MemberHandler::startInbodyDesc);
addStartHandler("location",this,&MemberHandler::startLocation);
addEndHandler("location");
......@@ -219,6 +230,7 @@ MemberHandler::~MemberHandler()
debug(2,"MemberHandler::~MemberHandler() %p\n",this);
delete m_brief;
delete m_detailed;
delete m_inbody;
delete m_linkedTextHandler;
delete m_reimplements;
}
......@@ -230,10 +242,17 @@ void MemberHandler::startMember(const QXmlAttributes& attrib)
//printf("startMember kindString=`%s'\n",m_kindString.data());
m_kind = s_typeMap->map(m_kindString);
m_id = attrib.value("id");
m_virtualness = attrib.value("virt");
m_protection = attrib.value("prot");
m_isStatic = attrib.value("static")=="yes";
m_isConst = attrib.value("const")=="yes";
m_isExplicit = attrib.value("explicit")=="yes";
m_isInline = attrib.value("inline")=="yes";
m_virtualness = attrib.value("virt");
m_isVolatile = attrib.value("volatile")=="yes";
m_isMutable = attrib.value("mutable")=="yes";
m_isReadable = attrib.value("readable")=="yes";
m_isWritable = attrib.value("writable")=="yes";
debug(2,"member kind=`%s' id=`%s' prot=`%s' virt=`%s'\n",
m_kindString.data(),m_id.data(),m_protection.data(),m_virtualness.data());
}
......@@ -245,10 +264,16 @@ void MemberHandler::startEnumValue(const QXmlAttributes& attrib)
//printf("startEnumValue kindString=`%s'\n",m_kindString.data());
m_kind = s_typeMap->map(m_kindString);
m_id = attrib.value("id");
m_virtualness = "non-virtual";
m_protection = attrib.value("prot");
m_isStatic = FALSE;
m_isConst = FALSE;
m_isExplicit = FALSE;
m_isInline = FALSE;
m_virtualness = "non-virtual";
m_isVolatile = FALSE;
m_isMutable = FALSE;
m_isReadable = FALSE;
m_isWritable = FALSE;
debug(2,"member kind=`%s' id=`%s' prot=`%s' virt=`%s'\n",
m_kindString.data(),m_id.data(),m_protection.data(),m_virtualness.data());
}
......@@ -275,6 +300,13 @@ void MemberHandler::startDetailedDesc(const QXmlAttributes& attrib)
m_detailed = docHandler;
}
void MemberHandler::startInbodyDesc(const QXmlAttributes& attrib)
{
DocHandler *docHandler = new DocHandler(this);
docHandler->startDoc(attrib);
m_inbody = docHandler;
}
void MemberHandler::startLocation(const QXmlAttributes& attrib)
{
m_defFile = attrib.value("file");
......@@ -364,7 +396,7 @@ void MemberHandler::startException(const QXmlAttributes &)
debug(2,"startException!\n");
delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_exception);
m_linkedTextHandler->start("exception");
m_linkedTextHandler->start("exceptions");
}
void MemberHandler::startName(const QXmlAttributes &)
......@@ -378,6 +410,50 @@ void MemberHandler::endName()
debug(2,"member name=`%s'\n",m_name.data());
}
void MemberHandler::startRead(const QXmlAttributes &)
{
m_curString="";
}
void MemberHandler::endRead()
{
m_read = m_curString.stripWhiteSpace();
debug(2,"member read=`%s'\n",m_read.data());
}
void MemberHandler::startWrite(const QXmlAttributes &)
{
m_curString="";
}
void MemberHandler::endWrite()
{
m_write = m_curString.stripWhiteSpace();
debug(2,"member write=`%s'\n",m_write.data());
}
void MemberHandler::startDefinition(const QXmlAttributes&)
{
m_curString="";
}
void MemberHandler::endDefinition()
{
m_definition = m_curString.stripWhiteSpace();
debug(2,"definition=%s\n",m_definition.data());
}
void MemberHandler::startArgsString(const QXmlAttributes&)
{
m_curString="";
}
void MemberHandler::endArgsString()
{
m_argsstring = m_curString.stripWhiteSpace();
debug(2,"arggstring=%s\n",m_argsstring.data());
}
void MemberHandler::startParam(const QXmlAttributes& attrib)
{
ParamHandler *paramHandler = new ParamHandler(this);
......@@ -515,3 +591,8 @@ IDocRoot *MemberHandler::detailedDescription() const
return m_detailed;
}
IDocRoot *MemberHandler::inbodyDescription() const
{
return m_inbody;
}
......@@ -129,8 +129,17 @@ class MemberHandler : public IDefine,
virtual void startType(const QXmlAttributes& attrib);
virtual void startName(const QXmlAttributes& attrib);
virtual void endName();
virtual void startRead(const QXmlAttributes& attrib);
virtual void endRead();
virtual void startWrite(const QXmlAttributes& attrib);
virtual void endWrite();
virtual void startDefinition(const QXmlAttributes& attrib);
virtual void endDefinition();
virtual void startArgsString(const QXmlAttributes& attrib);
virtual void endArgsString();
virtual void startBriefDesc(const QXmlAttributes& attrib);
virtual void startDetailedDesc(const QXmlAttributes& attrib);
virtual void startInbodyDesc(const QXmlAttributes& attrib);
virtual void startLocation(const QXmlAttributes& attrib);
virtual void startReferences(const QXmlAttributes& attrib);
virtual void endReferences();
......@@ -165,10 +174,30 @@ class MemberHandler : public IDefine,
{ return &m_virtualness; }
virtual const IString *name() const
{ return &m_name; }
virtual const IString *readAccessor() const
{ return &m_read; }
virtual const IString *writeAccessor() const
{ return &m_write; }
virtual const IString *definition() const
{ return &m_definition; }
virtual const IString *argsstring() const
{ return &m_argsstring; }
virtual bool isConst() const
{ return m_isConst; }
virtual bool isVolatile() const
{ return m_isVolatile; }
virtual bool isStatic() const
{ return m_isStatic; }
virtual bool isExplicit() const
{ return m_isExplicit; }
virtual bool isInline() const
{ return m_isInline; }
virtual bool isMutable() const
{ return m_isMutable; }
virtual bool isReadable() const
{ return m_isReadable; }
virtual bool isWritable() const
{ return m_isWritable; }
virtual ILinkedTextIterator *type() const;
virtual const IString *typeString() const;
virtual IParamIterator *parameters() const;
......@@ -190,6 +219,7 @@ class MemberHandler : public IDefine,
virtual IMemberReferenceIterator *reimplementedBy() const;
virtual IDocRoot *briefDescription() const;
virtual IDocRoot *detailedDescription() const;
virtual IDocRoot *inbodyDescription() const;
// IEnum
virtual IMemberIterator *enumValues() const;
......@@ -212,8 +242,13 @@ class MemberHandler : public IDefine,
QList<LinkedTextImpl> m_initializer;
QList<LinkedTextImpl> m_exception;
StringImpl m_name;
StringImpl m_read;
StringImpl m_write;
StringImpl m_definition;
StringImpl m_argsstring;
DocHandler *m_brief;
DocHandler *m_detailed;
DocHandler *m_inbody;
QList<ParamHandler> m_params;
QList<ParamHandler> m_templateParams;
QList<MemberReference> m_references;
......@@ -230,6 +265,12 @@ class MemberHandler : public IDefine,
QList<MemberHandler> m_enumValues;
bool m_insideTemplateParamList;
bool m_hasTemplateParamList;
bool m_isStatic;
bool m_isExplicit;
bool m_isInline;
bool m_isMutable;
bool m_isReadable;
bool m_isWritable;
};
class MemberIterator : public BaseIteratorVia<IMemberIterator,
......
......@@ -17,6 +17,7 @@
#include "memberhandler.h"
#include "linkedtexthandler.h"
#include "debug.h"
#include "dochandler.h"
TemplateParamListHandler::TemplateParamListHandler(IBaseHandler *parent) : m_parent(parent)
{
......@@ -49,7 +50,7 @@ void TemplateParamListHandler::endTemplateParamList()
///////////////////////////////////////////////////////////////////////////////////////////////////////
ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent)
ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent), m_brief(0)
{
addEndHandler("param",this,&ParamHandler::endParam);
......@@ -67,6 +68,8 @@ ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent)
addStartHandler("attribute");
addEndHandler("attribute",this,&ParamHandler::endAttrib);
addStartHandler("briefdescription",this,&ParamHandler::startBriefDesc);
addStartHandler("defval",this,&ParamHandler::startDefVal);
m_linkedTextHandler = 0;
......@@ -74,6 +77,7 @@ ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent)
ParamHandler::~ParamHandler()
{
delete m_brief;
delete m_linkedTextHandler;
}
......@@ -128,6 +132,13 @@ void ParamHandler::startDefVal(const QXmlAttributes& /*attrib*/)
debug(2,"member defVal\n");
}
void ParamHandler::startBriefDesc(const QXmlAttributes& attrib)
{
DocHandler *docHandler = new DocHandler(this);
docHandler->startDoc(attrib);
m_brief = docHandler;
}
ILinkedTextIterator *ParamHandler::type() const
{
return new LinkedTextIterator(m_type);
......@@ -138,4 +149,10 @@ ILinkedTextIterator *ParamHandler::defaultValue() const
return new LinkedTextIterator(m_defVal);
}
IDocRoot *ParamHandler::briefDescription() const
{
return m_brief;
}
......@@ -27,6 +27,7 @@
class LinkedTextImpl;
class LinkedTextHandler;
class DocHandler;
class ParamHandler : public IParam, public BaseHandler<ParamHandler>
......@@ -40,6 +41,7 @@ class ParamHandler : public IParam, public BaseHandler<ParamHandler>
virtual void endAttrib();
virtual void endArray();
virtual void startDefVal(const QXmlAttributes& attrib);
virtual void startBriefDesc(const QXmlAttributes& attrib);
ParamHandler(IBaseHandler *parent);
virtual ~ParamHandler();
......@@ -51,9 +53,11 @@ class ParamHandler : public IParam, public BaseHandler<ParamHandler>
virtual const IString * attrib() const { return &m_attrib; }
virtual const IString * arraySpecifier() const { return &m_array; }
virtual ILinkedTextIterator *defaultValue() const;
virtual IDocRoot *briefDescription() const;
private:
IBaseHandler *m_parent;
DocHandler *m_brief;
QList<LinkedTextImpl> m_type;
StringImpl m_declName;
StringImpl m_defName;
......
......@@ -130,10 +130,25 @@ void DumpDoc(IDoc *doc,int level)
InPrint(("</list item>\n"));
}
break;
case IDoc::ParameterItem:
{
IDocParameterItem *item = dynamic_cast<IDocParameterItem*>(doc);
InPrint(("<parameter item>\n"));
IDocIterator *di = item->paramNames();
IDoc *pdoc;
for (di->toFirst();(pdoc=di->current());di->toNext())
{
DumpDoc(pdoc,level+1);
}
di->release();
DumpDoc(item->description(),level+1);
InPrint(("</parameter item>\n"));
}
break;
case IDoc::ParameterList:
{
IDocParameterList *list = dynamic_cast<IDocParameterList*>(doc);
InPrint(("<parameter list type=%d>\n",list->listType()));
InPrint(("<parameter list type=%d>\n",list->sectType()));
IDocIterator *di = list->params();
IDoc *pdoc;
for (di->toFirst();(pdoc=di->current());di->toNext())
......@@ -149,9 +164,7 @@ void DumpDoc(IDoc *doc,int level)
{
IDocParameter *par = dynamic_cast<IDocParameter*>(doc);
ASSERT(par!=0);
InPrint(("<parameter name=%s>\n",par->name()->latin1()));
DumpDoc(par->description(),level+1);
InPrint(("<parameter/>\n"));
InPrint(("<parameter name=%s/>\n",par->name()->latin1()));
}
break;
case IDoc::SimpleSect:
......
......@@ -29,6 +29,7 @@
#include <qtoolbutton.h>
#include <qscrollview.h>
#include <qlayout.h>
#include <qtooltip.h>
#include "expert.h"
#include "inputbool.h"
......@@ -71,6 +72,7 @@ Expert::Expert( QWidget *parent ) : QTabDialog( parent )
view->addChild(page);
addTab(view,option->name());
QWhatsThis::add(page, option->docs().simplifyWhiteSpace() );
QToolTip::add(page, option->docs() );
}
break;
case ConfigOption::O_String:
......@@ -91,6 +93,7 @@ Expert::Expert( QWidget *parent ) : QTabDialog( parent )
);
pageLayout->addWidget(inputString);
QWhatsThis::add(inputString, option->docs().simplifyWhiteSpace() );
QToolTip::add(inputString,option->docs());
connect(inputString,SIGNAL(changed()),SIGNAL(changed()));
m_inputWidgets->insert(option->name(),inputString);
addDependency(m_switches,option->dependsOn(),option->name());
......@@ -113,6 +116,7 @@ Expert::Expert( QWidget *parent ) : QTabDialog( parent )
}
inputString->init();
QWhatsThis::add(inputString, option->docs().simplifyWhiteSpace() );
QToolTip::add(inputString, option->docs());
connect(inputString,SIGNAL(changed()),SIGNAL(changed()));
m_inputWidgets->insert(option->name(),inputString);
addDependency(m_switches,option->dependsOn(),option->name());
......@@ -137,6 +141,7 @@ Expert::Expert( QWidget *parent ) : QTabDialog( parent )
);
pageLayout->addWidget(inputStrList);
QWhatsThis::add(inputStrList, option->docs().simplifyWhiteSpace() );
QToolTip::add(inputStrList, option->docs());
connect(inputStrList,SIGNAL(changed()),SIGNAL(changed()));
m_inputWidgets->insert(option->name(),inputStrList);
addDependency(m_switches,option->dependsOn(),option->name());
......@@ -153,6 +158,7 @@ Expert::Expert( QWidget *parent ) : QTabDialog( parent )
);
pageLayout->addWidget(inputBool);
QWhatsThis::add(inputBool, option->docs().simplifyWhiteSpace() );
QToolTip::add(inputBool, option->docs() );
connect(inputBool,SIGNAL(changed()),SIGNAL(changed()));
m_inputWidgets->insert(option->name(),inputBool);
addDependency(m_switches,option->dependsOn(),option->name());
......@@ -170,6 +176,7 @@ Expert::Expert( QWidget *parent ) : QTabDialog( parent )
);
pageLayout->addWidget(inputInt);
QWhatsThis::add(inputInt, option->docs().simplifyWhiteSpace() );
QToolTip::add(inputInt, option->docs() );
connect(inputInt,SIGNAL(changed()),SIGNAL(changed()));
m_inputWidgets->insert(option->name(),inputInt);
addDependency(m_switches,option->dependsOn(),option->name());
......
......@@ -1986,25 +1986,22 @@ class C {};
\section cmdamp \&
\addindex \\\&
This command writes the \& character to the HTML and
\f$\mbox{\LaTeX}\f$ output. This character has to be escaped because
it has a special meaning in HTML.
This command writes the \& character to output.
This character has to be escaped because it has a special meaning in HTML.
<hr>
\section cmddollar \$
\addindex \\\$
This command writes the \$ character to the HTML and
\f$\mbox{\LaTeX}\f$ output. This
character has to be escaped in some cases, because it is used to expand
This command writes the \$ character to the output.
This character has to be escaped in some cases, because it is used to expand
environment variables.
<hr>
\section cmdhash \#
\addindex \\\#
This command writes the \# character to the HTML and
\f$\mbox{\LaTeX}\f$ output. This
This command writes the \# character to the output. This
character has to be escaped in some cases, because it is used to refer
to documented entities.
......@@ -2012,23 +2009,20 @@ class C {};
\section cmdlt \<
\addindex \\\<
This command writes the \< character to the HTML and
\f$\mbox{\LaTeX}\f$ output. This
character has to be escaped because it has a special meaning in HTML.
This command writes the \< character to the output.
This character has to be escaped because it has a special meaning in HTML.
<hr>
\section cmdgt \>
\addindex \\\>
This command writes the \> character to the HTML and
\f$\mbox{\LaTeX}\f$ output. This
This command writes the \> character to the output. This
character has to be escaped because it has a special meaning in HTML.
\section cmdperc \%
\addindex \\\%
This command writes the \% character to the HTML and
\f$\mbox{\LaTeX}\f$ output. This
This command writes the \% character to the output. This
character has to be escaped in some cases, because it is used to
prevent auto-linking to word that is also a documented class or struct.
......
......@@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other
than English (the default). The output language is chosen through the
configuration file (with default name and known as Doxyfile).
Currently (version 1.3.8-20040907), 30 languages
Currently (version 1.3.8-20040913), 30 languages
are supported (sorted alphabetically):
Afrikaans, Brazilian Portuguese, Catalan, Chinese, Chinese
Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French,
......@@ -90,7 +90,7 @@ when the translator was updated.
<td>Czech</td>
<td>Petr P&#x0159;ikryl</td>
<td>prikrylp at skil dot cz</td>
<td>1.3.9</td>
<td>up-to-date</td>
</tr>
<tr bgcolor="#ffffff">
<td>Danish</td>
......@@ -186,7 +186,7 @@ when the translator was updated.
<td>Polish</td>
<td>Piotr Kaminski<br>Grzegorz Kowal</td>
<td>Piotr.Kaminski at ctm dot gdynia dot pl<br>g_kowal at poczta dot onet dot pl</td>
<td>1.3.9</td>
<td>up-to-date</td>
</tr>
<tr bgcolor="#ffffff">
<td>Portuguese</td>
......@@ -271,7 +271,7 @@ when the translator was updated.
\hline
Croatian & Boris Bralo & {\tt\tiny boris.bralo@zg.htnet.hr} & 1.3.9 \\
\hline
Czech & Petr P\v{r}ikryl & {\tt\tiny prikrylp@skil.cz} & 1.3.9 \\
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 \\
\hline
......@@ -309,7 +309,7 @@ when the translator was updated.
\hline
Norwegian & Lars Erik Jordet & {\tt\tiny lejordet@gmail.com} & 1.3.9 \\
\hline
Polish & Piotr Kaminski & {\tt\tiny Piotr.Kaminski@ctm.gdynia.pl} & 1.3.9 \\
Polish & Piotr Kaminski & {\tt\tiny Piotr.Kaminski@ctm.gdynia.pl} & up-to-date \\
~ & Grzegorz Kowal & {\tt\tiny g\_kowal@poczta.onet.pl} & ~ \\
\hline
Portuguese & Rui Godinho Lopes & {\tt\tiny ruiglopes@yahoo.com} & 1.3.3 \\
......
(1.3.8-20040907)
(1.3.8-20040913)
Doxygen supports the following 30 languages (sorted alphabetically):
......@@ -8,7 +8,7 @@ German, Greek, Hungarian, Italian, Japanese (+En), Korean (+En),
Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, Serbian,
Slovak, Slovene, Spanish, Swedish, and Ukrainian.
Of them, 2 translators are up-to-date, 28 translators are based on
Of them, 4 translators are up-to-date, 26 translators are based on
some adapter class, and 2 are English based.
----------------------------------------------------------------------
......@@ -17,8 +17,10 @@ alphabetically). This means that they derive from the Translator class
and they implement all 201 of the required methods. Anyway, there
still may be some details listed even for them:
TranslatorCzech
TranslatorDutch
TranslatorEnglish
TranslatorPolish
----------------------------------------------------------------------
The following translator classes need some maintenance (the most
......@@ -27,14 +29,12 @@ version when the class was last updated and number of methods that
must be implemented to become up-to-date:
TranslatorRussian 1.3.9 6 methods to implement
TranslatorPolish 1.3.9 6 methods to implement
TranslatorNorwegian 1.3.9 6 methods to implement
TranslatorJapanese 1.3.9 6 methods to implement
TranslatorItalian 1.3.9 6 methods to implement
TranslatorHungarian 1.3.9 6 methods to implement
TranslatorGerman 1.3.9 6 methods to implement
TranslatorDanish 1.3.9 6 methods to implement
TranslatorCzech 1.3.9 6 methods to implement
TranslatorCroatian 1.3.9 6 methods to implement
TranslatorChinese 1.3.9 6 methods to implement
TranslatorBrazilian 1.3.9 6 methods to implement
......@@ -175,21 +175,6 @@ TranslatorCroatian (TranslatorAdapter_1_3_9) 6 methods to implement
virtual QCString trDir(bool first_capital, bool singular)
TranslatorCzech (TranslatorAdapter_1_3_9) 6 methods to implement
---------------
Implements 195 of the required methods.
Missing methods (should be implemented):
virtual QCString trDirIndex()
virtual QCString trDirDocumentation()
virtual QCString trDirectories()
virtual QCString trDirDescription()
virtual QCString trDirReference(const char * dirName)
virtual QCString trDir(bool first_capital, bool singular)
TranslatorDanish (TranslatorAdapter_1_3_9) 6 methods to implement
----------------
......@@ -511,21 +496,6 @@ TranslatorNorwegian (TranslatorAdapter_1_3_9) 6 methods to implement
virtual QCString trDir(bool first_capital, bool singular)
TranslatorPolish (TranslatorAdapter_1_3_9) 6 methods to implement
----------------
Implements 195 of the required methods.
Missing methods (should be implemented):
virtual QCString trDirIndex()
virtual QCString trDirDocumentation()
virtual QCString trDirectories()
virtual QCString trDirDescription()
virtual QCString trDirReference(const char * dirName)
virtual QCString trDir(bool first_capital, bool singular)
TranslatorPortuguese (TranslatorAdapter_1_3_3) 11 methods to implement
--------------------
......
Summary: A documentation system for C/C++.
Name: doxygen
Version: 1.3.8_20040913
Version: 1.3.8_20040928
Release: 1
Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
......
......@@ -296,11 +296,14 @@ class CallContext
}
virtual ~CallContext() {}
void setClass(ClassDef *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()
{
m_classList.append(0);
......@@ -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;
......
......@@ -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" />
......
......@@ -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"
......
......@@ -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");
......
......@@ -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
{
......
......@@ -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();
......@@ -157,7 +169,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();
if (fd->isLinkable())
{
ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name());
//if (!Config_getString("GENERATE_TAGFILE").isEmpty())
//{
// Doxygen::tagFile << " <file>" << convertToXML(fd->name()) << "</file>" << endl;
//}
}
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
......
......@@ -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());
}
......
......@@ -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()
......
......@@ -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);
......
......@@ -1110,4 +1110,9 @@ void FileDef::combineUsingRelations()
}
}
bool FileDef::isDocumentationFile() const
{
return name().right(4)==".doc" ||
name().right(4)==".txt" ||
name().right(4)==".dox";
}
......@@ -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);
......
......@@ -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);
......
......@@ -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
......@@ -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,
......
......@@ -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();
}
......
......@@ -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
{
if (!hasFuncPtrType);
{
ol.docify(" ");
}
ol.disable(OutputGenerator::Man);
ol.startEmphasis();
ol.enable(OutputGenerator::Man);
......@@ -177,7 +194,7 @@ static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
{
ol.docify(a->array);
}
if (vp!=-1) // write the part of the argument type
if (hasFuncPtrType) // write the part of the argument type
// that comes after the name
{
linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),
......@@ -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--;
......
......@@ -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();
......
......@@ -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}/"(" {
......
......@@ -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();
......
"<?\n"
"function readInt($file)\n"
"{\n"
" $b1 = ord(fgetc($file)); $b2 = ord(fgetc($file));\n"
......
......@@ -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)
......
......@@ -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";
}
};
......
......@@ -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
......@@ -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
......@@ -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;
}
......
......@@ -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
......@@ -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
......@@ -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
......@@ -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
......@@ -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 );
}
};
......
......@@ -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 "Trffar:";
}
//////////////////////////////////////////////////////////////////////////
// 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 "Kllkodsfilen " + 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 hr 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
......@@ -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());
}
......
......@@ -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)
......
......@@ -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());
......
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