Commit 0df9adf5 authored by dimitri's avatar dimitri

Doxygen-1.2.13-20020122

parent a66e1ada
...@@ -95,7 +95,7 @@ IGNORE_PREFIX = ...@@ -95,7 +95,7 @@ IGNORE_PREFIX =
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to the HTML output # configuration options related to the HTML output
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
GENERATE_HTML = YES GENERATE_HTML = NO
HTML_OUTPUT = HTML_OUTPUT =
HTML_HEADER = HTML_HEADER =
HTML_FOOTER = HTML_FOOTER =
...@@ -168,7 +168,7 @@ PERL_PATH = /usr/bin/perl ...@@ -168,7 +168,7 @@ PERL_PATH = /usr/bin/perl
# Configuration options related to the dot tool # Configuration options related to the dot tool
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
CLASS_DIAGRAMS = NO CLASS_DIAGRAMS = NO
HAVE_DOT = YES HAVE_DOT = NO
CLASS_GRAPH = YES CLASS_GRAPH = YES
COLLABORATION_GRAPH = YES COLLABORATION_GRAPH = YES
TEMPLATE_RELATIONS = YES TEMPLATE_RELATIONS = YES
......
DOXYGEN Version 1.2.13.1 DOXYGEN Version 1.2.13-20020121
Please read the installation section of the manual for instructions. Please read the installation section of the manual for instructions.
-------- --------
Dimitri van Heesch (05 January 2002) Dimitri van Heesch (21 January 2002)
...@@ -10,6 +10,7 @@ clean: FORCE ...@@ -10,6 +10,7 @@ clean: FORCE
cd addon/doxywizard ; $(MAKE) clean cd addon/doxywizard ; $(MAKE) clean
cd addon/doxmlparser/src ; $(MAKE) clean cd addon/doxmlparser/src ; $(MAKE) clean
cd addon/doxmlparser/test ; $(MAKE) clean cd addon/doxmlparser/test ; $(MAKE) clean
cd addon/doxmlparser/examples/metrics ; $(MAKE) clean
-rm -f bin/doxy* -rm -f bin/doxy*
-rm -f objects/*.o -rm -f objects/*.o
...@@ -18,6 +19,7 @@ distclean: clean ...@@ -18,6 +19,7 @@ distclean: clean
cd addon/doxywizard ; $(MAKE) distclean cd addon/doxywizard ; $(MAKE) distclean
cd addon/doxmlparser/src ; $(MAKE) distclean cd addon/doxmlparser/src ; $(MAKE) distclean
cd addon/doxmlparser/test ; $(MAKE) distclean cd addon/doxmlparser/test ; $(MAKE) distclean
cd addon/doxmlparser/examples/metrics ; $(MAKE) distclean
-rm -f lib/lib* -rm -f lib/lib*
-rm -f bin/doxy* -rm -f bin/doxy*
-rm -f html -rm -f html
......
DOXYGEN Version 1.2.13.1 DOXYGEN Version 1.2.13_20020121
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. ...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy, Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (05 January 2002) Dimitri van Heesch (dimitri@stack.nl) (21 January 2002)
1.2.13.1 1.2.13-20020121
...@@ -43,7 +43,7 @@ SHOW_USED_FILES = YES ...@@ -43,7 +43,7 @@ SHOW_USED_FILES = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# configuration options related to warning and progress messages # configuration options related to warning and progress messages
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
QUIET = YES QUIET = NO
WARNINGS = YES WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES WARN_IF_UNDOCUMENTED = YES
WARN_FORMAT = WARN_FORMAT =
......
all clean depend: Makefile.metrics
$(MAKE) -f Makefile.metrics $@
distclean: clean
$(RM) -rf Makefile.metrics metrics.pro Makefile obj
tmake:
$(ENV) $(PERL) $(TMAKE) metrics.pro >Makefile.metrics
Makefile.metrics: metrics.pro
$(ENV) $(PERL) $(TMAKE) metrics.pro >Makefile.metrics
install:
/******************************************************************************
*
* $Id$
*
*
* Copyright (C) 1997-2002 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
* granted. No representations are made about the suitability of this software
* for any purpose. It is provided "as is" without express or implied warranty.
* See the GNU General Public License for more details.
*
*/
/*! \mainpage Metrics
* This is a small example that shows how to use doxygen's XML output and
* the doxmlparser library. The example shows some very basic code metrics.
*/
#include <stdio.h>
#include <doxmlintf.h>
bool isDocumented(IDocRoot *brief,IDocRoot *detailed)
{
bool found=FALSE;
if (brief)
{
IDocIterator *docIt = brief->contents();
if (docIt->current()) // method has brief description
{
found=TRUE;
}
docIt->release();
}
if (detailed && !found)
{
IDocIterator *docIt = detailed->contents();
if (docIt->current())
{
found=TRUE;
}
docIt->release();
}
return found;
}
int main(int argc,char **argv)
{
if (argc!=2)
{
printf("Usage: %s xml_output_dir\n",argv[0]);
exit(1);
}
int numClasses=0;
int numDocClasses=0;
int numStructs=0;
int numUnions=0;
int numInterfaces=0;
int numExceptions=0;
int numNamespaces=0;
int numFiles=0;
int numGroups=0;
int numPages=0;
int numPackages=0;
int numPubMethods=0;
int numProMethods=0;
int numPriMethods=0;
int numDocPubMethods=0;
int numDocProMethods=0;
int numDocPriMethods=0;
int numFunctions=0;
int numAttributes=0;
int numVariables=0;
int numDocFunctions=0;
int numDocAttributes=0;
int numDocVariables=0;
int numParams=0;
IDoxygen *dox = createObjectModel();
dox->setDebugLevel(0);
if (!dox->readXMLDir(argv[1]))
{
printf("Error reading %s/index.xml\n",argv[1]);
exit(1);
}
ICompoundIterator *cli = dox->compounds();
ICompound *comp;
for (cli->toFirst();(comp=cli->current());cli->toNext())
{
printf("Processing %s...\n",comp->name().data());
bool hasDocs = isDocumented(comp->briefDescription(),comp->detailedDescription());
switch (comp->kind())
{
case ICompound::Class:
numClasses++;
if (hasDocs) numDocClasses++;
break;
case ICompound::Struct: numStructs++; break;
case ICompound::Union: numUnions++; break;
case ICompound::Interface: numInterfaces++; break;
case ICompound::Exception: numExceptions++; break;
case ICompound::Namespace: numNamespaces++; break;
case ICompound::File: numFiles++; break;
case ICompound::Group: numGroups++; break;
case ICompound::Page: numPages++; break;
case ICompound::Package: numPackages++; break;
default: break;
}
ISectionIterator *sli = comp->sections();
ISection *sec;
for (sli->toFirst();(sec=sli->current());sli->toNext())
{
IMemberIterator *mli = sec->members();
IMember *mem;
for (mli->toFirst();(mem=mli->current());mli->toNext())
{
IParamIterator *pli = mem->params();
IParam *par;
if (comp->kind()==ICompound::Class ||
comp->kind()==ICompound::Struct ||
comp->kind()==ICompound::Interface
)
{
if (mem->kind()==IMember::Function ||
mem->kind()==IMember::Prototype ||
mem->kind()==IMember::Signal ||
mem->kind()==IMember::Slot ||
mem->kind()==IMember::DCOP
) // is a "method"
{
if (mem->section()->isPublic())
{
numPubMethods++;
if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
{
numDocPubMethods++;
}
}
else if (mem->section()->isProtected())
{
numProMethods++;
if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
{
numDocProMethods++;
}
}
else if (mem->section()->isPrivate())
{
numPriMethods++;
if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
{
numDocPriMethods++;
}
}
}
else if (mem->kind()==IMember::Variable ||
mem->kind()==IMember::Property
) // is an "attribute"
{
numAttributes++;
if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
{
numDocAttributes++;
}
}
}
else if (comp->kind()==ICompound::File ||
comp->kind()==ICompound::Namespace
)
{
if (mem->kind()==IMember::Function ||
mem->kind()==IMember::Prototype ||
mem->kind()==IMember::Signal ||
mem->kind()==IMember::Slot ||
mem->kind()==IMember::DCOP
) // is a "method"
{
numFunctions++;
if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
{
numDocFunctions++;
}
}
else if (mem->kind()==IMember::Variable ||
mem->kind()==IMember::Property
) // is an "attribute"
{
numVariables++;
if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
{
numDocVariables++;
}
}
}
for (pli->toFirst();(par=pli->current());pli->toNext())
{
numParams++;
}
if (mem->typeString()!="void")
{
numParams++; // count non-void return types as well
}
pli->release();
}
mli->release();
}
sli->release();
comp->release();
}
cli->release();
dox->release();
int numMethods = numPubMethods+numProMethods+numPriMethods;
int numDocMethods = numDocPubMethods+numDocProMethods+numDocPriMethods;
printf("Metrics:\n");
printf("-----------------------------------\n");
if (numClasses>0) printf("Classes: %10d (%d documented)\n",numClasses,numDocClasses);
if (numStructs>0) printf("Structs: %10d\n",numStructs);
if (numUnions>0) printf("Unions: %10d\n",numUnions);
if (numInterfaces>0) printf("Interfaces: %10d\n",numInterfaces);
if (numExceptions>0) printf("Exceptions: %10d\n",numExceptions);
if (numNamespaces>0) printf("Namespaces: %10d\n",numNamespaces);
if (numFiles>0) printf("Files: %10d\n",numFiles);
if (numGroups>0) printf("Groups: %10d\n",numGroups);
if (numPages>0) printf("Pages: %10d\n",numPages);
if (numPackages>0) printf("Packages: %10d\n",numPackages);
if (numMethods>0) printf("Methods: %10d (%d documented)\n",numMethods,numDocMethods);
if (numPubMethods>0) printf(" Public: %10d (%d documented)\n",numPubMethods,numDocPubMethods);
if (numProMethods>0) printf(" Protected: %10d (%d documented)\n",numProMethods,numDocProMethods);
if (numPriMethods>0) printf(" Private: %10d (%d documented)\n",numPriMethods,numDocPriMethods);
if (numFunctions>0) printf("Functions: %10d (%d documented)\n",numFunctions,numDocFunctions);
if (numAttributes>0) printf("Attributes: %10d (%d documented)\n",numAttributes,numDocAttributes);
if (numVariables>0) printf("Variables: %10d (%d documented)\n",numVariables,numDocVariables);
if (numParams>0) printf("Params: %10d\n",numParams);
printf("-----------------------------------\n");
if (numClasses>0) printf("Avg. #methods/compound: %10f\n",(double)numMethods/(double)numClasses);
if (numMethods>0) printf("Avg. #params/method: %10f\n",(double)numParams/(double)numMethods);
printf("-----------------------------------\n");
return 0;
}
TEMPLATE = app.t
CONFIG = console warn_on $extraopts
HEADERS =
SOURCES = main.cpp
unix:LIBS += -L../../../../lib -L../../lib -ldoxmlparser -lqtools
win32:INCLUDEPATH += .
win32-mingw:LIBS += -L../../../../lib -L../../lib -ldoxmlparser -lqtools
win32-msvc:LIBS += doxmlparser.lib qtools.lib shell32.lib
win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\..\..\..\lib;..\..\lib
win32-borland:LIBS += doxmlparser.lib qtools.lib shell32.lib
win32-borland:TMAKE_LFLAGS += -L..\..\..\..\lib -L..\..\lib
win32:TMAKE_CXXFLAGS += -DQT_NODLL
DESTDIR =
OBJECTS_DIR = obj
TARGET = metrics
DEPENDPATH = ../../include
INCLUDEPATH += ../../../../qtools ../../include
unix:TARGETDEPS = ../../lib/libdoxmlparser.a
win32:TARGETDEPS = ..\..\lib\doxmlparser.lib
...@@ -5,12 +5,15 @@ ...@@ -5,12 +5,15 @@
class IMember; class IMember;
class IDocIterator; class IDocIterator;
class ICompound;
class ISection;
class ILinkedText class ILinkedText
{ {
public: public:
enum Kind { Kind_Text, Kind_Ref }; enum Kind { Kind_Text, Kind_Ref };
virtual Kind kind() const = 0; virtual Kind kind() const = 0;
virtual ~ILinkedText() {}
}; };
class ILT_Text : public ILinkedText class ILT_Text : public ILinkedText
...@@ -49,6 +52,7 @@ class IParam ...@@ -49,6 +52,7 @@ class IParam
virtual QString attrib() const = 0; virtual QString attrib() const = 0;
virtual QString arraySpecifier() const = 0; virtual QString arraySpecifier() const = 0;
virtual ILinkedTextIterator *defaultValue() const = 0; virtual ILinkedTextIterator *defaultValue() const = 0;
virtual ~IParam() {}
}; };
class IParamIterator class IParamIterator
...@@ -67,6 +71,7 @@ class IMemberReference ...@@ -67,6 +71,7 @@ class IMemberReference
public: public:
virtual IMember *member() const = 0; virtual IMember *member() const = 0;
virtual QString memberName() const = 0; virtual QString memberName() const = 0;
virtual ~IMemberReference() {}
}; };
class IMemberReferenceIterator class IMemberReferenceIterator
...@@ -85,6 +90,7 @@ class IEnumValue ...@@ -85,6 +90,7 @@ class IEnumValue
public: public:
virtual QString name() const = 0; virtual QString name() const = 0;
virtual QString initializer() const = 0; virtual QString initializer() const = 0;
virtual ~IEnumValue() {}
}; };
class IEnumValueIterator class IEnumValueIterator
...@@ -136,6 +142,7 @@ class IDoc ...@@ -136,6 +142,7 @@ class IDoc
Root // 30 -> IDocRoot Root // 30 -> IDocRoot
}; };
virtual Kind kind() const = 0; virtual Kind kind() const = 0;
virtual ~IDoc() {}
}; };
class IDocMarkup : public IDoc class IDocMarkup : public IDoc
...@@ -234,7 +241,7 @@ class IDocRef : public IDoc ...@@ -234,7 +241,7 @@ class IDocRef : public IDoc
{ {
public: public:
enum TargetKind { Member, Compound }; enum TargetKind { Member, Compound };
virtual QString id() const = 0; virtual QString refId() const = 0;
virtual TargetKind targetKind() const = 0; virtual TargetKind targetKind() const = 0;
virtual QString external() const = 0; virtual QString external() const = 0;
virtual QString text() const = 0; virtual QString text() const = 0;
...@@ -340,11 +347,19 @@ class IDocIterator ...@@ -340,11 +347,19 @@ class IDocIterator
class IMember class IMember
{ {
public: public:
virtual QString kind() const = 0; enum MemberKind { Invalid=0,
Define, Property, Variable, Typedef, Enum,
Function, Signal, Prototype, Friend, DCOP, Slot
};
virtual ICompound *compound() const = 0;
virtual ISection *section() const = 0;
virtual MemberKind kind() const = 0;
virtual QString kindString() const = 0;
virtual QString id() const = 0; virtual QString id() const = 0;
virtual QString protection() const = 0; virtual QString protection() const = 0;
virtual QString virtualness() const = 0; virtual QString virtualness() const = 0;
virtual ILinkedTextIterator *type() const = 0; virtual ILinkedTextIterator *type() const = 0;
virtual QString typeString() const = 0;
virtual QString name() const = 0; virtual QString name() const = 0;
virtual bool isConst() const = 0; virtual bool isConst() const = 0;
virtual bool isVolatile() const = 0; virtual bool isVolatile() const = 0;
...@@ -362,6 +377,7 @@ class IMember ...@@ -362,6 +377,7 @@ class IMember
virtual IEnumValueIterator *enumValues() const = 0; virtual IEnumValueIterator *enumValues() const = 0;
virtual IDocRoot *briefDescription() const = 0; virtual IDocRoot *briefDescription() const = 0;
virtual IDocRoot *detailedDescription() const = 0; virtual IDocRoot *detailedDescription() const = 0;
virtual ~IMember() {}
}; };
class IMemberIterator class IMemberIterator
...@@ -378,8 +394,26 @@ class IMemberIterator ...@@ -378,8 +394,26 @@ class IMemberIterator
class ISection class ISection
{ {
public: public:
virtual QString kind() const = 0; enum SectionKind { Invalid=0,
UserDefined,
PubTypes, PubFuncs, PubAttribs, PubSlots,
Signals, DCOPFuncs, Properties,
PubStatFuncs, PubStatAttribs,
ProTypes, ProFuncs, ProAttribs, ProSlots,
ProStatFuncs, ProStatAttribs,
PriTypes, PriFuncs, PriAttribs, PriSlots,
PriStatFuncs, PriStatAttribs,
Friend, Related, Defines, Prototypes, Typedefs,
Enums, Functions, Variables
};
virtual QString kindString() const = 0;
virtual SectionKind kind() const = 0;
virtual IMemberIterator *members() const = 0; virtual IMemberIterator *members() const = 0;
virtual bool isStatic() const = 0;
virtual bool isPublic() const = 0;
virtual bool isPrivate() const = 0;
virtual bool isProtected() const = 0;
virtual ~ISection() {}
}; };
class ISectionIterator class ISectionIterator
...@@ -396,21 +430,42 @@ class ISectionIterator ...@@ -396,21 +430,42 @@ class ISectionIterator
class ICompound class ICompound
{ {
public: public:
enum CompoundKind { Invalid=0,
Class, Struct, Union, Interface, Exception,
Namespace, File, Group, Page, Package
};
virtual QString name() const = 0; virtual QString name() const = 0;
virtual QString id() const = 0; virtual QString id() const = 0;
virtual QString kind() const = 0; virtual CompoundKind kind() const = 0;
virtual QString kindString() const = 0;
virtual ISectionIterator *sections() const = 0; virtual ISectionIterator *sections() const = 0;
virtual IDocRoot *briefDescription() const = 0; virtual IDocRoot *briefDescription() const = 0;
virtual IDocRoot *detailedDescription() const = 0; virtual IDocRoot *detailedDescription() const = 0;
/*! Returns an interface to a member given its id.
* @param id The member id.
*/
virtual IMember *memberById(const QString &id) const = 0;
/*! Returns a list of all members within the compound having a certain
* name. Overloading is the reason why there can be more than one member.
* @param name The name of the member.
*/
virtual IMemberIterator *memberByName(const QString &name) const = 0;
/*! Decreases the reference counter for this compound. If it reaches
* zero, the memory for the compound will be released.
*/
virtual void release() = 0;
}; };
class ICompoundIterator class ICompoundIterator
{ {
public: public:
virtual ICompound *toFirst() = 0; virtual void toFirst() = 0;
virtual ICompound *toLast() = 0; virtual void toLast() = 0;
virtual ICompound *toNext() = 0; virtual void toNext() = 0;
virtual ICompound *toPrev() = 0; virtual void toPrev() = 0;
virtual ICompound *current() const = 0; virtual ICompound *current() const = 0;
virtual void release() = 0; virtual void release() = 0;
}; };
...@@ -419,6 +474,7 @@ class ICompoundIterator ...@@ -419,6 +474,7 @@ class ICompoundIterator
class IDoxygen class IDoxygen
{ {
public: public:
/*! Returns an iterator that can be used to iterate over the list /*! Returns an iterator that can be used to iterate over the list
* of compounds found in the project. * of compounds found in the project.
*/ */
...@@ -435,28 +491,43 @@ class IDoxygen ...@@ -435,28 +491,43 @@ class IDoxygen
*/ */
virtual ICompound *compoundByName(const QString &name) const = 0; virtual ICompound *compoundByName(const QString &name) const = 0;
/*! Returns an interface to a member given its id. /*! Returns an interface to a compound containing a member given it the
* member's id. Given the ICompound interface one can use the same id
* to obtain the IMember interface.
* @param id The member id. * @param id The member id.
*/ */
virtual IMember *memberById(const QString &id) const = 0; virtual ICompound *memberById(const QString &id) const = 0;
/*! Returns a list of all members with a certain name. /*! Returns a list of all compounds containing at least one members
* with a certain name. Each compound can be asked to return the
* list of members with that name.
* @param name The name of the member. * @param name The name of the member.
*/ */
virtual IMemberIterator *memberByName(const QString &name) const = 0; virtual ICompoundIterator *memberByName(const QString &name) const = 0;
/*! Releases the memory for the object hierarchy obtained by /*! Releases the memory for the object hierarchy obtained by
* createdObjecModelFromXML(). First release all iterators before calling * createdObjecModelFromXML(). First release all iterators before calling
* this function. * this function.
*/ */
virtual void release() = 0; virtual void release() = 0;
/*! Sets the debug level.
* - 0 all debugging messages are disabled (the default).
* - 1 display important messages only
* - 2 display any messages.
*/
virtual void setDebugLevel(int level) = 0;
/*! Reads an XML directory produced by doxygen and builds up a data
* structure representing the contents of the XML files in the directory.
*/
virtual bool readXMLDir(const char *xmlDirName) = 0;
}; };
/*! Factory method that creates an object model given an XML file generated /*! Factory method that creates an empty object model for a doxygen generated XML file.
* by doxygen. * Use the readXMLDir() method to build the model from an XML output
* @param xmlFileName The name of the XML to parse. * directory containing doxygen output.
* @returns An iterface to the object model.
*/ */
IDoxygen *createObjectModelFromXML(const char *xmlFileName); IDoxygen *createObjectModel();
#endif #endif
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -20,11 +20,14 @@ ...@@ -20,11 +20,14 @@
#include <qdict.h> #include <qdict.h>
#include <qstring.h> #include <qstring.h>
#include "debug.h"
class IBaseHandler class IBaseHandler
{ {
public: public:
virtual void setDelegate(QXmlDefaultHandler *delegate) = 0; virtual void setDelegate(QXmlDefaultHandler *delegate) = 0;
virtual QXmlDefaultHandler *delegate() const = 0; virtual QXmlDefaultHandler *delegate() const = 0;
virtual ~IBaseHandler() {}
}; };
class IFallBackHandler class IFallBackHandler
...@@ -33,6 +36,7 @@ class IFallBackHandler ...@@ -33,6 +36,7 @@ class IFallBackHandler
virtual bool handleStartElement(const QString & name, virtual bool handleStartElement(const QString & name,
const QXmlAttributes & attrib) = 0; const QXmlAttributes & attrib) = 0;
virtual bool handleEndElement(const QString &name) = 0; virtual bool handleEndElement(const QString &name) = 0;
virtual ~IFallBackHandler() {}
}; };
template<class T> class ElementMapper template<class T> class ElementMapper
...@@ -104,9 +108,15 @@ template<class T> class ElementMapper ...@@ -104,9 +108,15 @@ template<class T> class ElementMapper
QDict<EndElementHandlerT> m_endHandlers; QDict<EndElementHandlerT> m_endHandlers;
}; };
template<class T> class BaseHandler : public IBaseHandler, struct LocatorContainer
public QXmlDefaultHandler, {
public ElementMapper<T> static QXmlLocator *s_theLocator;
};
template<class T> class BaseHandler : public QXmlDefaultHandler,
public ElementMapper<T>,
public LocatorContainer,
public IBaseHandler
{ {
public: public:
BaseHandler() : m_delegateHandler(0), m_fallBackHandler(0) BaseHandler() : m_delegateHandler(0), m_fallBackHandler(0)
...@@ -136,7 +146,9 @@ template<class T> class BaseHandler : public IBaseHandler, ...@@ -136,7 +146,9 @@ template<class T> class BaseHandler : public IBaseHandler,
if (!m_skipUntil.isEmpty()) // skip mode if (!m_skipUntil.isEmpty()) // skip mode
{ {
if (m_skipUntil==name) m_skipCount++; if (m_skipUntil==name) m_skipCount++;
printf("skipping start tag %s count=%d\n",name.data(),m_skipCount); debug(1,"line %d, col %d: skipping start tag %s count=%d\n",
s_theLocator->lineNumber(),s_theLocator->columnNumber(),
name.data(),m_skipCount);
return TRUE; return TRUE;
} }
...@@ -150,7 +162,9 @@ template<class T> class BaseHandler : public IBaseHandler, ...@@ -150,7 +162,9 @@ template<class T> class BaseHandler : public IBaseHandler,
!m_fallBackHandler->handleStartElement(name,attrib) !m_fallBackHandler->handleStartElement(name,attrib)
) )
{ {
printf("found unexpected tag `%s', skipping until matching end tag\n",name.data()); debug(1,"line %d, col %d: found unexpected tag `%s', skipping until matching end tag\n",
s_theLocator->lineNumber(),s_theLocator->columnNumber(),
name.data());
m_skipUntil = name; m_skipUntil = name;
m_skipCount=1; m_skipCount=1;
} }
...@@ -167,7 +181,9 @@ template<class T> class BaseHandler : public IBaseHandler, ...@@ -167,7 +181,9 @@ template<class T> class BaseHandler : public IBaseHandler,
if (name==m_skipUntil) if (name==m_skipUntil)
{ {
m_skipCount--; m_skipCount--;
printf("skipping end tag %s count=%d\n",name.data(),m_skipCount); debug(1,"line %d, col %d: skipping end tag %s count=%d\n",
s_theLocator->lineNumber(),s_theLocator->columnNumber(),
name.data(),m_skipCount);
if (m_skipCount==0) if (m_skipCount==0)
{ {
m_skipUntil=""; m_skipUntil="";
...@@ -198,7 +214,9 @@ template<class T> class BaseHandler : public IBaseHandler, ...@@ -198,7 +214,9 @@ template<class T> class BaseHandler : public IBaseHandler,
return m_delegateHandler->skippedEntity(s); return m_delegateHandler->skippedEntity(s);
} }
printf("Skipped unhandled entity %s\n",s.data()); debug(1,"line %d, col %d: Skipped unhandled entity %s\n",
s_theLocator->lineNumber(),s_theLocator->columnNumber(),
s.data());
return TRUE; return TRUE;
} }
...@@ -237,6 +255,12 @@ template<class T> class BaseHandler : public IBaseHandler, ...@@ -237,6 +255,12 @@ template<class T> class BaseHandler : public IBaseHandler,
return m_fallBackHandler; return m_fallBackHandler;
} }
void setDocumentLocator( QXmlLocator * locator )
{
debug(2,"setDocumentLocator(%p)\n",locator);
s_theLocator = locator;
}
protected: protected:
QString m_curString; QString m_curString;
QString m_skipUntil; QString m_skipUntil;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -16,14 +16,97 @@ ...@@ -16,14 +16,97 @@
#include "mainhandler.h" #include "mainhandler.h"
#include "compoundhandler.h" #include "compoundhandler.h"
#include "dochandler.h" #include "dochandler.h"
#include "debug.h"
CompoundHandler::CompoundHandler(IBaseHandler *parent) class CompoundErrorHandler : public QXmlErrorHandler
: m_parent(parent), m_brief(0), m_detailed(0), m_programListing(0) {
public:
virtual ~CompoundErrorHandler() {}
bool warning( const QXmlParseException & )
{
return FALSE;
}
bool error( const QXmlParseException & )
{
return FALSE;
}
bool fatalError( const QXmlParseException &exception )
{
debug(1,"Fatal error at line %d column %d: %s\n",
exception.lineNumber(),exception.columnNumber(),
exception.message().data());
return FALSE;
}
QString errorString() { return ""; }
private:
QString errorMsg;
};
//----------------------------------------------------------------------------
class CompoundTypeMap
{
public:
CompoundTypeMap()
{
m_map.setAutoDelete(TRUE);
m_map.insert("class",new int(ICompound::Class));
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("exception",new int(ICompound::Exception));
m_map.insert("namespace",new int(ICompound::Namespace));
m_map.insert("file",new int(ICompound::File));
m_map.insert("group",new int(ICompound::Group));
m_map.insert("page",new int(ICompound::Page));
m_map.insert("package",new int(ICompound::Package));
}
virtual ~CompoundTypeMap()
{
}
ICompound::CompoundKind map(const QString &s)
{
int *val = m_map.find(s);
if (val==0)
{
debug(1,"Warning: `%s' is an invalid compound type\n",s.data());
return ICompound::Invalid;
}
else return (ICompound::CompoundKind)*val;
}
private:
QDict<int> m_map;
};
static CompoundTypeMap *s_typeMap;
void compoundhandler_init()
{
s_typeMap = new CompoundTypeMap;
}
void compoundhandler_exit()
{
delete s_typeMap;
}
//----------------------------------------------------------------------------
CompoundHandler::CompoundHandler(const QString &xmlDir)
: m_brief(0), m_detailed(0), m_programListing(0),
m_xmlDir(xmlDir), m_refCount(1), m_memberDict(257), m_memberNameDict(257),
m_mainHandler(0)
{ {
m_superClasses.setAutoDelete(TRUE); m_superClasses.setAutoDelete(TRUE);
m_subClasses.setAutoDelete(TRUE); m_subClasses.setAutoDelete(TRUE);
m_sections.setAutoDelete(TRUE); m_sections.setAutoDelete(TRUE);
m_memberNameDict.setAutoDelete(TRUE);
addStartHandler("doxygen");
addEndHandler("doxygen");
addStartHandler("compounddef",this,&CompoundHandler::startCompound);
addEndHandler("compounddef",this,&CompoundHandler::endCompound); addEndHandler("compounddef",this,&CompoundHandler::endCompound);
addStartHandler("compoundname"); addStartHandler("compoundname");
...@@ -45,10 +128,12 @@ CompoundHandler::CompoundHandler(IBaseHandler *parent) ...@@ -45,10 +128,12 @@ CompoundHandler::CompoundHandler(IBaseHandler *parent)
addEndHandler("location"); addEndHandler("location");
addStartHandler("programlisting",this,&CompoundHandler::startProgramListing); addStartHandler("programlisting",this,&CompoundHandler::startProgramListing);
} }
CompoundHandler::~CompoundHandler() CompoundHandler::~CompoundHandler()
{ {
debug(2,"CompoundHandler::~CompoundHandler()\n");
delete m_brief; delete m_brief;
delete m_detailed; delete m_detailed;
delete m_programListing; delete m_programListing;
...@@ -84,28 +169,27 @@ void CompoundHandler::startProgramListing(const QXmlAttributes& attrib) ...@@ -84,28 +169,27 @@ void CompoundHandler::startProgramListing(const QXmlAttributes& attrib)
void CompoundHandler::startCompound(const QXmlAttributes& attrib) void CompoundHandler::startCompound(const QXmlAttributes& attrib)
{ {
m_parent->setDelegate(this);
m_id = attrib.value("id"); m_id = attrib.value("id");
m_kind = attrib.value("kind"); m_kindString = attrib.value("kind");
printf("startCompound(id=`%s' type=`%s')\n",m_id.data(),m_kind.data()); m_kind = s_typeMap->map(m_kindString);
debug(2,"startCompound(id=`%s' type=`%s')\n",m_id.data(),m_kindString.data());
} }
void CompoundHandler::startLocation(const QXmlAttributes& attrib) void CompoundHandler::endCompound()
{ {
m_defFile = attrib.value("file"); debug(2,"endCompound()\n");
m_defLine = attrib.value("line").toInt();
} }
void CompoundHandler::endCompound() void CompoundHandler::startLocation(const QXmlAttributes& attrib)
{ {
printf("endCompound()\n"); m_defFile = attrib.value("file");
m_parent->setDelegate(0); m_defLine = attrib.value("line").toInt();
} }
void CompoundHandler::endCompoundName() void CompoundHandler::endCompoundName()
{ {
m_name = m_curString.stripWhiteSpace(); m_name = m_curString.stripWhiteSpace();
printf("Compound name `%s'\n",m_name.data()); debug(2,"Compound name `%s'\n",m_name.data());
} }
void CompoundHandler::addSuperClass(const QXmlAttributes& attrib) void CompoundHandler::addSuperClass(const QXmlAttributes& attrib)
...@@ -115,7 +199,7 @@ void CompoundHandler::addSuperClass(const QXmlAttributes& attrib) ...@@ -115,7 +199,7 @@ void CompoundHandler::addSuperClass(const QXmlAttributes& attrib)
attrib.value("prot"), attrib.value("prot"),
attrib.value("virt") attrib.value("virt")
); );
printf("super class id=`%s' prot=`%s' virt=`%s'\n", debug(2,"super class id=`%s' prot=`%s' virt=`%s'\n",
sc->m_id.data(), sc->m_id.data(),
sc->m_protection.data(), sc->m_protection.data(),
sc->m_virtualness.data()); sc->m_virtualness.data());
...@@ -129,20 +213,56 @@ void CompoundHandler::addSubClass(const QXmlAttributes& attrib) ...@@ -129,20 +213,56 @@ void CompoundHandler::addSubClass(const QXmlAttributes& attrib)
attrib.value("prot"), attrib.value("prot"),
attrib.value("virt") attrib.value("virt")
); );
printf("sub class id=`%s' prot=`%s' virt=`%s'\n", debug(2,"sub class id=`%s' prot=`%s' virt=`%s'\n",
sc->m_id.data(), sc->m_id.data(),
sc->m_protection.data(), sc->m_protection.data(),
sc->m_virtualness.data()); sc->m_virtualness.data());
m_subClasses.append(sc); m_subClasses.append(sc);
} }
void CompoundHandler::initialize(MainHandler *m) bool CompoundHandler::parseXML(const QString &compId)
{
QFile xmlFile(m_xmlDir+"/"+compId+".xml");
if (!xmlFile.exists()) return FALSE;
CompoundErrorHandler errorHandler;
QXmlInputSource source( xmlFile );
QXmlSimpleReader reader;
reader.setContentHandler( this );
reader.setErrorHandler( &errorHandler );
reader.parse( source );
return TRUE;
}
void CompoundHandler::initialize(MainHandler *mh)
{ {
m_mainHandler = mh;
QListIterator<ISection> msi(m_sections); QListIterator<ISection> msi(m_sections);
SectionHandler *sec; SectionHandler *sec;
for (;(sec=(SectionHandler *)msi.current());++msi) for (;(sec=(SectionHandler *)msi.current());++msi)
{ {
sec->initialize(m); sec->initialize(this);
}
}
void CompoundHandler::insertMember(MemberHandler *mh)
{
m_memberDict.insert(mh->id(),mh);
QList<MemberHandler> *mhl = m_memberNameDict.find(mh->id());
if (mhl==0)
{
mhl = new QList<MemberHandler>;
m_memberNameDict.insert(mh->name(),mhl);
}
mhl->append(mh);
}
void CompoundHandler::release()
{
debug(2,"CompoundHandler::release() %d->%d\n",m_refCount,m_refCount-1);
if (--m_refCount<=0)
{
m_mainHandler->unloadCompound(this);
delete this;
} }
} }
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -28,13 +28,6 @@ class MainHandler; ...@@ -28,13 +28,6 @@ class MainHandler;
class DocHandler; class DocHandler;
class ProgramListingHandler; class ProgramListingHandler;
class CompoundIterator : public BaseIterator<ICompoundIterator,ICompound,ICompound>
{
public:
CompoundIterator(const QList<ICompound> &list) :
BaseIterator<ICompoundIterator,ICompound,ICompound>(list) {}
};
class CompoundHandler : public ICompound, public BaseHandler<CompoundHandler> class CompoundHandler : public ICompound, public BaseHandler<CompoundHandler>
{ {
public: public:
...@@ -48,22 +41,34 @@ class CompoundHandler : public ICompound, public BaseHandler<CompoundHandler> ...@@ -48,22 +41,34 @@ class CompoundHandler : public ICompound, public BaseHandler<CompoundHandler>
virtual void startDetailedDesc(const QXmlAttributes& attrib); virtual void startDetailedDesc(const QXmlAttributes& attrib);
virtual void startLocation(const QXmlAttributes& attrib); virtual void startLocation(const QXmlAttributes& attrib);
virtual void startProgramListing(const QXmlAttributes& attrib); virtual void startProgramListing(const QXmlAttributes& attrib);
virtual void addref() { m_refCount++; }
CompoundHandler(IBaseHandler *parent); CompoundHandler(const QString &dirName);
virtual ~CompoundHandler(); virtual ~CompoundHandler();
void initialize(MainHandler *m); bool parseXML(const QString &compId);
void initialize(MainHandler *mh);
void insertMember(MemberHandler *mh);
// ICompound implementation // ICompound implementation
QString name() const { return m_name; } QString name() const { return m_name; }
QString id() const { return m_id; } QString id() const { return m_id; }
QString kind() const { return m_kind; } CompoundKind kind() const { return m_kind; }
QString kindString() const { return m_kindString; }
ISectionIterator *sections() const ISectionIterator *sections() const
{ return new SectionIterator(m_sections); } { return new SectionIterator(m_sections); }
virtual IDocRoot *briefDescription() const virtual IDocRoot *briefDescription() const
{ return m_brief; } { return m_brief; }
virtual IDocRoot *detailedDescription() const virtual IDocRoot *detailedDescription() const
{ return m_detailed; } { return m_detailed; }
virtual IMember *memberById(const QString &id) const
{ return m_memberDict[id]; }
virtual IMemberIterator *memberByName(const QString &name) const
{
QList<MemberHandler> *ml = m_memberNameDict[name];
if (ml==0) return 0;
return new MemberIterator(*ml);
}
virtual void release();
private: private:
struct SuperClass struct SuperClass
...@@ -87,15 +92,23 @@ class CompoundHandler : public ICompound, public BaseHandler<CompoundHandler> ...@@ -87,15 +92,23 @@ class CompoundHandler : public ICompound, public BaseHandler<CompoundHandler>
QList<SuperClass> m_superClasses; QList<SuperClass> m_superClasses;
QList<SubClass> m_subClasses; QList<SubClass> m_subClasses;
QList<ISection> m_sections; QList<ISection> m_sections;
IBaseHandler *m_parent;
DocHandler *m_brief; DocHandler *m_brief;
DocHandler *m_detailed; DocHandler *m_detailed;
ProgramListingHandler *m_programListing; ProgramListingHandler *m_programListing;
QString m_id; QString m_id;
QString m_kind; QString m_kindString;
CompoundKind m_kind;
QString m_name; QString m_name;
QString m_defFile; QString m_defFile;
int m_defLine; int m_defLine;
QString m_xmlDir;
int m_refCount;
QDict<MemberHandler> m_memberDict;
QDict<QList<MemberHandler> > m_memberNameDict;
MainHandler *m_mainHandler;
}; };
void compoundhandler_init();
void compoundhandler_exit();
#endif #endif
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include "debug.h"
static int s_debugLevel = 0;
void debug(int level,const char *msg,...)
{
if (level<=s_debugLevel)
{
va_list args;
va_start(args, msg);
vfprintf(stderr, msg, args);
va_end(args);
}
}
void setDebugLevel(int level)
{
s_debugLevel = level;
}
#ifndef _DEBUG_H
#define _DEBUG_H
void debug(int level,const char *msg,...);
void setDebugLevel(int level);
#endif
This diff is collapsed.
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -449,11 +449,16 @@ class RefHandler : public IDocRef, public BaseHandler<RefHandler> ...@@ -449,11 +449,16 @@ class RefHandler : public IDocRef, public BaseHandler<RefHandler>
// IDocRef // IDocRef
virtual Kind kind() const { return Ref; } virtual Kind kind() const { return Ref; }
virtual QString refId() const { return m_refId; } virtual QString refId() const { return m_refId; }
virtual TargetKind targetKind() const { return m_targetKind; }
virtual QString external() const { return m_extId; }
virtual QString text() const { return m_linkText; }
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_refId; QString m_refId;
QString m_linkText; QString m_extId;
QString m_linkText;
TargetKind m_targetKind;
}; };
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
...@@ -582,7 +587,7 @@ class VariableListHandler : public IDocVariableList, public BaseHandler<Variable ...@@ -582,7 +587,7 @@ class VariableListHandler : public IDocVariableList, public BaseHandler<Variable
/*! \brief Node representing a highlighted text fragment. /*! \brief Node representing a highlighted text fragment.
* *
*/ */
// children: - // TODO: children: ref
class HighlightHandler : public IDocHighlight, public BaseHandler<HighlightHandler> class HighlightHandler : public IDocHighlight, public BaseHandler<HighlightHandler>
{ {
public: public:
...@@ -590,14 +595,17 @@ class HighlightHandler : public IDocHighlight, public BaseHandler<HighlightHandl ...@@ -590,14 +595,17 @@ class HighlightHandler : public IDocHighlight, public BaseHandler<HighlightHandl
virtual ~HighlightHandler(); virtual ~HighlightHandler();
void startHighlight(const QXmlAttributes& attrib); void startHighlight(const QXmlAttributes& attrib);
void endHighlight(); void endHighlight();
virtual void startRef(const QXmlAttributes&);
// IDocHighlight // IDocHighlight
virtual Kind kind() const { return Highlight; } virtual Kind kind() const { return Highlight; }
private: private:
void addTextNode();
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_class; QString m_class;
QString m_text; QList<IDoc> m_children;
}; };
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
...@@ -915,4 +923,7 @@ class DocIterator : public BaseIterator<IDocIterator,IDoc,IDoc> ...@@ -915,4 +923,7 @@ class DocIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {} BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
}; };
void dochandler_init();
void dochandler_exit();
#endif #endif
...@@ -5,12 +5,15 @@ ...@@ -5,12 +5,15 @@
class IMember; class IMember;
class IDocIterator; class IDocIterator;
class ICompound;
class ISection;
class ILinkedText class ILinkedText
{ {
public: public:
enum Kind { Kind_Text, Kind_Ref }; enum Kind { Kind_Text, Kind_Ref };
virtual Kind kind() const = 0; virtual Kind kind() const = 0;
virtual ~ILinkedText() {}
}; };
class ILT_Text : public ILinkedText class ILT_Text : public ILinkedText
...@@ -49,6 +52,7 @@ class IParam ...@@ -49,6 +52,7 @@ class IParam
virtual QString attrib() const = 0; virtual QString attrib() const = 0;
virtual QString arraySpecifier() const = 0; virtual QString arraySpecifier() const = 0;
virtual ILinkedTextIterator *defaultValue() const = 0; virtual ILinkedTextIterator *defaultValue() const = 0;
virtual ~IParam() {}
}; };
class IParamIterator class IParamIterator
...@@ -67,6 +71,7 @@ class IMemberReference ...@@ -67,6 +71,7 @@ class IMemberReference
public: public:
virtual IMember *member() const = 0; virtual IMember *member() const = 0;
virtual QString memberName() const = 0; virtual QString memberName() const = 0;
virtual ~IMemberReference() {}
}; };
class IMemberReferenceIterator class IMemberReferenceIterator
...@@ -85,6 +90,7 @@ class IEnumValue ...@@ -85,6 +90,7 @@ class IEnumValue
public: public:
virtual QString name() const = 0; virtual QString name() const = 0;
virtual QString initializer() const = 0; virtual QString initializer() const = 0;
virtual ~IEnumValue() {}
}; };
class IEnumValueIterator class IEnumValueIterator
...@@ -136,6 +142,7 @@ class IDoc ...@@ -136,6 +142,7 @@ class IDoc
Root // 30 -> IDocRoot Root // 30 -> IDocRoot
}; };
virtual Kind kind() const = 0; virtual Kind kind() const = 0;
virtual ~IDoc() {}
}; };
class IDocMarkup : public IDoc class IDocMarkup : public IDoc
...@@ -234,7 +241,7 @@ class IDocRef : public IDoc ...@@ -234,7 +241,7 @@ class IDocRef : public IDoc
{ {
public: public:
enum TargetKind { Member, Compound }; enum TargetKind { Member, Compound };
virtual QString id() const = 0; virtual QString refId() const = 0;
virtual TargetKind targetKind() const = 0; virtual TargetKind targetKind() const = 0;
virtual QString external() const = 0; virtual QString external() const = 0;
virtual QString text() const = 0; virtual QString text() const = 0;
...@@ -340,11 +347,19 @@ class IDocIterator ...@@ -340,11 +347,19 @@ class IDocIterator
class IMember class IMember
{ {
public: public:
virtual QString kind() const = 0; enum MemberKind { Invalid=0,
Define, Property, Variable, Typedef, Enum,
Function, Signal, Prototype, Friend, DCOP, Slot
};
virtual ICompound *compound() const = 0;
virtual ISection *section() const = 0;
virtual MemberKind kind() const = 0;
virtual QString kindString() const = 0;
virtual QString id() const = 0; virtual QString id() const = 0;
virtual QString protection() const = 0; virtual QString protection() const = 0;
virtual QString virtualness() const = 0; virtual QString virtualness() const = 0;
virtual ILinkedTextIterator *type() const = 0; virtual ILinkedTextIterator *type() const = 0;
virtual QString typeString() const = 0;
virtual QString name() const = 0; virtual QString name() const = 0;
virtual bool isConst() const = 0; virtual bool isConst() const = 0;
virtual bool isVolatile() const = 0; virtual bool isVolatile() const = 0;
...@@ -362,6 +377,7 @@ class IMember ...@@ -362,6 +377,7 @@ class IMember
virtual IEnumValueIterator *enumValues() const = 0; virtual IEnumValueIterator *enumValues() const = 0;
virtual IDocRoot *briefDescription() const = 0; virtual IDocRoot *briefDescription() const = 0;
virtual IDocRoot *detailedDescription() const = 0; virtual IDocRoot *detailedDescription() const = 0;
virtual ~IMember() {}
}; };
class IMemberIterator class IMemberIterator
...@@ -378,8 +394,26 @@ class IMemberIterator ...@@ -378,8 +394,26 @@ class IMemberIterator
class ISection class ISection
{ {
public: public:
virtual QString kind() const = 0; enum SectionKind { Invalid=0,
UserDefined,
PubTypes, PubFuncs, PubAttribs, PubSlots,
Signals, DCOPFuncs, Properties,
PubStatFuncs, PubStatAttribs,
ProTypes, ProFuncs, ProAttribs, ProSlots,
ProStatFuncs, ProStatAttribs,
PriTypes, PriFuncs, PriAttribs, PriSlots,
PriStatFuncs, PriStatAttribs,
Friend, Related, Defines, Prototypes, Typedefs,
Enums, Functions, Variables
};
virtual QString kindString() const = 0;
virtual SectionKind kind() const = 0;
virtual IMemberIterator *members() const = 0; virtual IMemberIterator *members() const = 0;
virtual bool isStatic() const = 0;
virtual bool isPublic() const = 0;
virtual bool isPrivate() const = 0;
virtual bool isProtected() const = 0;
virtual ~ISection() {}
}; };
class ISectionIterator class ISectionIterator
...@@ -396,21 +430,42 @@ class ISectionIterator ...@@ -396,21 +430,42 @@ class ISectionIterator
class ICompound class ICompound
{ {
public: public:
enum CompoundKind { Invalid=0,
Class, Struct, Union, Interface, Exception,
Namespace, File, Group, Page, Package
};
virtual QString name() const = 0; virtual QString name() const = 0;
virtual QString id() const = 0; virtual QString id() const = 0;
virtual QString kind() const = 0; virtual CompoundKind kind() const = 0;
virtual QString kindString() const = 0;
virtual ISectionIterator *sections() const = 0; virtual ISectionIterator *sections() const = 0;
virtual IDocRoot *briefDescription() const = 0; virtual IDocRoot *briefDescription() const = 0;
virtual IDocRoot *detailedDescription() const = 0; virtual IDocRoot *detailedDescription() const = 0;
/*! Returns an interface to a member given its id.
* @param id The member id.
*/
virtual IMember *memberById(const QString &id) const = 0;
/*! Returns a list of all members within the compound having a certain
* name. Overloading is the reason why there can be more than one member.
* @param name The name of the member.
*/
virtual IMemberIterator *memberByName(const QString &name) const = 0;
/*! Decreases the reference counter for this compound. If it reaches
* zero, the memory for the compound will be released.
*/
virtual void release() = 0;
}; };
class ICompoundIterator class ICompoundIterator
{ {
public: public:
virtual ICompound *toFirst() = 0; virtual void toFirst() = 0;
virtual ICompound *toLast() = 0; virtual void toLast() = 0;
virtual ICompound *toNext() = 0; virtual void toNext() = 0;
virtual ICompound *toPrev() = 0; virtual void toPrev() = 0;
virtual ICompound *current() const = 0; virtual ICompound *current() const = 0;
virtual void release() = 0; virtual void release() = 0;
}; };
...@@ -419,6 +474,7 @@ class ICompoundIterator ...@@ -419,6 +474,7 @@ class ICompoundIterator
class IDoxygen class IDoxygen
{ {
public: public:
/*! Returns an iterator that can be used to iterate over the list /*! Returns an iterator that can be used to iterate over the list
* of compounds found in the project. * of compounds found in the project.
*/ */
...@@ -435,28 +491,43 @@ class IDoxygen ...@@ -435,28 +491,43 @@ class IDoxygen
*/ */
virtual ICompound *compoundByName(const QString &name) const = 0; virtual ICompound *compoundByName(const QString &name) const = 0;
/*! Returns an interface to a member given its id. /*! Returns an interface to a compound containing a member given it the
* member's id. Given the ICompound interface one can use the same id
* to obtain the IMember interface.
* @param id The member id. * @param id The member id.
*/ */
virtual IMember *memberById(const QString &id) const = 0; virtual ICompound *memberById(const QString &id) const = 0;
/*! Returns a list of all members with a certain name. /*! Returns a list of all compounds containing at least one members
* with a certain name. Each compound can be asked to return the
* list of members with that name.
* @param name The name of the member. * @param name The name of the member.
*/ */
virtual IMemberIterator *memberByName(const QString &name) const = 0; virtual ICompoundIterator *memberByName(const QString &name) const = 0;
/*! Releases the memory for the object hierarchy obtained by /*! Releases the memory for the object hierarchy obtained by
* createdObjecModelFromXML(). First release all iterators before calling * createdObjecModelFromXML(). First release all iterators before calling
* this function. * this function.
*/ */
virtual void release() = 0; virtual void release() = 0;
/*! Sets the debug level.
* - 0 all debugging messages are disabled (the default).
* - 1 display important messages only
* - 2 display any messages.
*/
virtual void setDebugLevel(int level) = 0;
/*! Reads an XML directory produced by doxygen and builds up a data
* structure representing the contents of the XML files in the directory.
*/
virtual bool readXMLDir(const char *xmlDirName) = 0;
}; };
/*! Factory method that creates an object model given an XML file generated /*! Factory method that creates an empty object model for a doxygen generated XML file.
* by doxygen. * Use the readXMLDir() method to build the model from an XML output
* @param xmlFileName The name of the XML to parse. * directory containing doxygen output.
* @returns An iterface to the object model.
*/ */
IDoxygen *createObjectModelFromXML(const char *xmlFileName); IDoxygen *createObjectModel();
#endif #endif
...@@ -3,11 +3,13 @@ CONFIG = console staticlib warn_on $extraopts ...@@ -3,11 +3,13 @@ CONFIG = console staticlib warn_on $extraopts
HEADERS = basehandler.h mainhandler.h \ HEADERS = basehandler.h mainhandler.h \
compoundhandler.h sectionhandler.h \ compoundhandler.h sectionhandler.h \
memberhandler.h paramhandler.h \ memberhandler.h paramhandler.h \
dochandler.h linkedtexthandler.h dochandler.h linkedtexthandler.h \
debug.h
SOURCES = mainhandler.cpp \ SOURCES = mainhandler.cpp \
compoundhandler.cpp sectionhandler.cpp \ compoundhandler.cpp sectionhandler.cpp \
memberhandler.cpp paramhandler.cpp \ memberhandler.cpp paramhandler.cpp \
dochandler.cpp linkedtexthandler.cpp dochandler.cpp linkedtexthandler.cpp \
basehandler.cpp debug.cpp
unix:LIBS += -L../../../lib -lqtools unix:LIBS += -L../../../lib -lqtools
win32:INCLUDEPATH += . win32:INCLUDEPATH += .
win32-mingw:LIBS += -L../../../lib -lqtools win32-mingw:LIBS += -L../../../lib -lqtools
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
* *
*/ */
#include "linkedtexthandler.h" #include "linkedtexthandler.h"
#include "debug.h"
#include <doxmlintf.h> #include <doxmlintf.h>
class LT_Text : public ILT_Text class LT_Text : public ILT_Text
...@@ -46,9 +47,9 @@ class LT_Ref : public ILT_Ref ...@@ -46,9 +47,9 @@ class LT_Ref : public ILT_Ref
virtual Kind kind() const { return Kind_Ref; } virtual Kind kind() const { return Kind_Ref; }
private: private:
QString m_refId; QString m_refId;
QString m_extId; QString m_extId;
QString m_text; QString m_text;
TargetKind m_targetKind; TargetKind m_targetKind;
}; };
...@@ -79,7 +80,7 @@ void LinkedTextHandler::end() ...@@ -79,7 +80,7 @@ void LinkedTextHandler::end()
if (!m_curString.isEmpty()) if (!m_curString.isEmpty())
{ {
m_children.append(new LT_Text(m_curString)); m_children.append(new LT_Text(m_curString));
printf("LinkedTextHandler: add text `%s'\n",m_curString.data()); debug(2,"LinkedTextHandler: add text `%s'\n",m_curString.data());
m_curString=""; m_curString="";
} }
m_parent->setDelegate(0); m_parent->setDelegate(0);
...@@ -90,7 +91,7 @@ void LinkedTextHandler::startRef(const QXmlAttributes& attrib) ...@@ -90,7 +91,7 @@ void LinkedTextHandler::startRef(const QXmlAttributes& attrib)
if (!m_curString.isEmpty()) if (!m_curString.isEmpty())
{ {
m_children.append(new LT_Text(m_curString)); m_children.append(new LT_Text(m_curString));
printf("LinkedTextHandler: add text `%s'\n",m_curString.data()); debug(2,"LinkedTextHandler: add text `%s'\n",m_curString.data());
m_curString=""; m_curString="";
} }
ASSERT(m_ref==0); ASSERT(m_ref==0);
...@@ -98,15 +99,34 @@ void LinkedTextHandler::startRef(const QXmlAttributes& attrib) ...@@ -98,15 +99,34 @@ void LinkedTextHandler::startRef(const QXmlAttributes& attrib)
m_ref->setRefId(attrib.value("refid")); m_ref->setRefId(attrib.value("refid"));
m_ref->setExtId(attrib.value("external")); m_ref->setExtId(attrib.value("external"));
ASSERT(attrib.value("kindref")=="compound" || attrib.value("kindref")=="member"); ASSERT(attrib.value("kindref")=="compound" || attrib.value("kindref")=="member");
m_ref->setTargetKind(attrib.value("kindref")=="compound" ? Compound : Member); m_ref->setTargetKind(attrib.value("kindref")=="compound" ? ILT_Ref::Compound : ILT_Ref::Member);
} }
void LinkedTextHandler::endRef() void LinkedTextHandler::endRef()
{ {
m_ref->setText(m_curString); m_ref->setText(m_curString);
m_children.append(m_ref); m_children.append(m_ref);
printf("LinkedTextHandler: add ref `%s'\n",m_ref->text().data()); debug(2,"LinkedTextHandler: add ref `%s'\n",m_ref->text().data());
m_ref=0; m_ref=0;
} }
QString LinkedTextHandler::toString(const QList<ILinkedText> &list)
{
QListIterator<ILinkedText> li(list);
QString result;
ILinkedText *lt;
for (li.toFirst();(lt=li.current());++li)
{
switch(lt->kind())
{
case ILinkedText::Kind_Text:
result+=dynamic_cast<ILT_Text*>(lt)->text();
break;
case ILinkedText::Kind_Ref:
result+=dynamic_cast<ILT_Ref *>(lt)->text();
break;
}
}
return result;
}
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -36,6 +36,7 @@ class LinkedTextHandler : public BaseHandler<LinkedTextHandler> ...@@ -36,6 +36,7 @@ class LinkedTextHandler : public BaseHandler<LinkedTextHandler>
virtual void end(); virtual void end();
virtual void startRef(const QXmlAttributes& attrib); virtual void startRef(const QXmlAttributes& attrib);
virtual void endRef(); virtual void endRef();
static QString toString(const QList<ILinkedText> &list);
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -15,112 +15,261 @@ ...@@ -15,112 +15,261 @@
#include <qxml.h> #include <qxml.h>
#include "mainhandler.h" #include "mainhandler.h"
#include "compoundhandler.h"
#include "debug.h"
MainHandler::MainHandler() : m_compoundDict(10007), m_compoundNameDict(10007) class ErrorHandler : public QXmlErrorHandler
{
public:
virtual ~ErrorHandler() {}
bool warning( const QXmlParseException & )
{
return FALSE;
}
bool error( const QXmlParseException & )
{
return FALSE;
}
bool fatalError( const QXmlParseException &exception )
{
debug(1,"Fatal error at line %d column %d: %s\n",
exception.lineNumber(),exception.columnNumber(),
exception.message().data());
return FALSE;
}
QString errorString() { return ""; }
private:
QString errorMsg;
};
//--------------------------------------------------------------------------
class CompoundEntryIterator : public ICompoundIterator,
public QListIterator<CompoundEntry>
{
public:
CompoundEntryIterator(const MainHandler *m,const QList<CompoundEntry> &list) :
QListIterator<CompoundEntry>(list), m_mainHandler(m) {}
virtual ~CompoundEntryIterator() {}
virtual void toFirst()
{
QListIterator<CompoundEntry>::toFirst();
}
virtual void toLast()
{
QListIterator<CompoundEntry>::toLast();
}
virtual void toNext()
{
QListIterator<CompoundEntry>::operator++();
}
virtual void toPrev()
{
QListIterator<CompoundEntry>::operator--();
}
virtual ICompound *current() const
{
CompoundEntry *ch = QListIterator<CompoundEntry>::current();
return ch ? m_mainHandler->compoundById(ch->id) : 0;
}
virtual void release()
{ delete this; }
private:
const MainHandler *m_mainHandler;
};
//--------------------------------------------------------------------------
MainHandler::MainHandler() : m_compoundDict(2999), m_compoundNameDict(2999),
m_memberDict(12251), m_memberNameDict(12251),
m_compoundsLoaded(1009)
{ {
m_compounds.setAutoDelete(TRUE); m_compounds.setAutoDelete(TRUE);
m_memberNameDict.setAutoDelete(TRUE);
addStartHandler("doxygen"); addStartHandler("doxygen");
addStartHandler("compounddef",this,&MainHandler::startCompound);
addEndHandler("doxygen"); addEndHandler("doxygen");
addEndHandler("compounddef"); addStartHandler("compound",this,&MainHandler::startCompound);
addEndHandler("compound");
addStartHandler("member",this,&MainHandler::startMember);
addEndHandler("member",this,&MainHandler::endMember);
addStartHandler("name",this,&MainHandler::startName);
addEndHandler("name",this,&MainHandler::endName);
m_curCompound = 0;
} }
MainHandler::~MainHandler() MainHandler::~MainHandler()
{ {
printf("MainHandler::~MainHandler()\n"); debug(2,"MainHandler::~MainHandler()\n");
} }
void MainHandler::startCompound(const QXmlAttributes& attrib) void MainHandler::startCompound(const QXmlAttributes& attrib)
{ {
CompoundHandler *compHandler = new CompoundHandler(this); m_curCompound = new CompoundEntry(257);
compHandler->startCompound(attrib); m_curCompound->id = attrib.value("id");
m_compounds.append(compHandler); m_compounds.append(m_curCompound);
m_compoundDict.insert(m_curCompound->id,m_curCompound);
} }
void MainHandler::insertMemberById(const QString &id,IMember *h) void MainHandler::startName(const QXmlAttributes& /*attrib*/)
{ {
m_memberDict.insert(id,h); m_curString = "";
} }
void MainHandler::insertMemberByName(const QString &name,IMember *h) void MainHandler::endName()
{ {
QList<IMember> *ml = m_memberNameDict[name]; m_curCompound->name = m_curString;
if (ml) }
void MainHandler::startMember(const QXmlAttributes& attrib)
{
m_curString = "";
m_curMember = new MemberEntry;
m_curMember->id = attrib.value("id");
m_curMember->compound = m_curCompound;
m_memberDict.insert(m_curMember->id,m_curMember);
}
void MainHandler::endMember()
{
m_curMember->name = m_curString;
m_curCompound->memberDict.insert(m_curString,m_curMember);
QList<CompoundEntry> *cel=0;
if ((cel=m_memberNameDict.find(m_curString))==0)
{ {
ml->append(h); cel = new QList<CompoundEntry>;
m_memberNameDict.insert(m_curString,cel);
} }
else cel->append(m_curCompound);
}
void MainHandler::setDebugLevel(int level)
{
::setDebugLevel(level);
}
void MainHandler::dump()
{
QListIterator<CompoundEntry> cli(m_compounds);
CompoundEntry *ce;
for (cli.toFirst();(ce=cli.current());++cli)
{ {
ml = new QList<IMember>; debug(2,"compound id=`%s' name=`%s'\n",ce->id.data(),ce->name.data());
ml->append(h); QDictIterator<MemberEntry> mdi(ce->memberDict);
m_memberNameDict.insert(name,ml); MemberEntry *me;
for (mdi.toFirst();(me=mdi.current());++mdi)
{
debug(2," member id=`%s' name=`%s'\n",me->id.data(),me->name.data());
}
} }
} }
void MainHandler::initialize() bool MainHandler::readXMLDir(const char * xmlDirName)
{ {
QListIterator<ICompound> mci(m_compounds); m_xmlDirName = xmlDirName;
CompoundHandler *compHandler; QString xmlFileName=m_xmlDirName+"/index.xml";
for (;(compHandler=(CompoundHandler *)mci.current());++mci) QFile xmlFile(xmlFileName);
//printf("Trying %s xmlFile.exists()=%d isReadable()=%d\n",
// xmlFileName.data(),xmlFile.exists(),xmlFile.isReadable());
if (xmlFile.exists())
{ {
compHandler->initialize(this); ErrorHandler errorHandler;
m_compoundNameDict.insert(compHandler->name(),compHandler); QXmlInputSource source( xmlFile );
m_compoundDict.insert(compHandler->id(),compHandler); QXmlSimpleReader reader;
reader.setContentHandler( this );
reader.setErrorHandler( &errorHandler );
reader.parse( source );
dump();
return TRUE;
} }
return FALSE;
}
ICompoundIterator *MainHandler::compounds() const
{
return new CompoundEntryIterator(this,m_compounds);
}
// for each member ICompound *MainHandler::compoundById(const QString &id) const
QDictIterator< QList<IMember> > mndi(m_memberNameDict); {
QList<IMember> *ml; if (id.isEmpty()) return 0;
for (;(ml=mndi.current());++mndi) CompoundHandler *ch = m_compoundsLoaded[id];
if (ch) // compound already in memory
{ {
QListIterator<IMember> mli(*ml); ch->addref(); // returning alias -> increase reference counter
IMember *mem; return ch;
for (;(mem=mli.current());++mli) }
{ CompoundEntry *ce = m_compoundDict.find(id);
((MemberHandler*)mem)->initialize(this); if (ce==0) return 0; // id not found
} // create and load a new compound
ch = new CompoundHandler(m_xmlDirName);
if (!ch->parseXML(id))
{
// compound could not be initialized.
delete ch;
return 0;
} }
// we disregard the constness here, because the object stays conceptually
// unchanged.
MainHandler *that = (MainHandler *)this;
ch->initialize(that);
that->m_compoundsLoaded.insert(id,ch);
return ch;
} }
class ErrorHandler : public QXmlErrorHandler void MainHandler::unloadCompound(CompoundHandler *ch)
{ {
public: m_compoundsLoaded.remove(ch->id());
virtual ~ErrorHandler() {} }
bool warning( const QXmlParseException & )
{
return FALSE;
}
bool error( const QXmlParseException & )
{
return FALSE;
}
bool fatalError( const QXmlParseException &exception )
{
fprintf(stderr,"Fatal error at line %d column %d: %s\n",
exception.lineNumber(),exception.columnNumber(),
exception.message().data());
return FALSE;
}
QString errorString() { return ""; }
private: ICompound *MainHandler::compoundByName(const QString &name) const
QString errorMsg; {
}; if (name.isEmpty()) return 0;
CompoundEntry *ce = m_compoundNameDict[name];
if (ce==0) return 0; // name not found
return compoundById(ce->id);
}
IDoxygen *createObjectModelFromXML(const char * xmlFileName) ICompound *MainHandler::memberById(const QString &id) const
{ {
QFile xmlFile(xmlFileName); if (id.isEmpty()) return 0;
MainHandler * handler = new MainHandler; MemberEntry *me = m_memberDict[id];
ErrorHandler errorHandler; if (me==0) return 0; // id not found
QXmlInputSource source( xmlFile ); return compoundById(me->id);
QXmlSimpleReader reader; }
reader.setContentHandler( handler );
reader.setErrorHandler( &errorHandler ); ICompoundIterator *MainHandler::memberByName(const QString &name) const
reader.parse( source ); {
printf("<---------- initialize ----------->\n"); if (name.isEmpty()) return 0;
handler->initialize(); QList<CompoundEntry> *cel = m_memberNameDict[name];
printf("<-------- end initialize --------->\n"); if (cel==0) return 0; // name not found
return handler; return new CompoundEntryIterator(this,*cel);
}
IDoxygen *createObjectModel()
{
compoundhandler_init();
sectionhandler_init();
memberhandler_init();
dochandler_init();
return new MainHandler;
}
void MainHandler::release()
{
QDictIterator<CompoundHandler> chi(m_compoundsLoaded);
CompoundHandler *ch;
for (chi.toFirst();(ch=chi.current());++chi)
{
debug(1,"Compound %s not released\n",ch->name().data());
}
dochandler_exit();
memberhandler_exit();
sectionhandler_exit();
compoundhandler_exit();
delete this;
} }
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -22,47 +22,60 @@ ...@@ -22,47 +22,60 @@
#include <doxmlintf.h> #include <doxmlintf.h>
#include "memberhandler.h" #include "memberhandler.h"
struct CompoundEntry;
struct IndexEntry
{
QString id;
QString name;
};
struct MemberEntry : public IndexEntry
{
CompoundEntry *compound;
};
struct CompoundEntry : public IndexEntry
{
CompoundEntry(int size) : memberDict(size)
{ memberDict.setAutoDelete(TRUE); }
QDict<MemberEntry> memberDict;
};
class MainHandler : public IDoxygen, public BaseHandler<MainHandler> class MainHandler : public IDoxygen, public BaseHandler<MainHandler>
{ {
public: public:
virtual void startCompound(const QXmlAttributes& attrib); virtual void startCompound(const QXmlAttributes& attrib);
virtual void startMember(const QXmlAttributes& attrib);
virtual void endMember();
virtual void startName(const QXmlAttributes& attrib);
virtual void endName();
MainHandler(); MainHandler();
virtual ~MainHandler(); virtual ~MainHandler();
ICompoundIterator *compounds() const // IDoxygen
{ ICompoundIterator *compounds() const;
return new CompoundIterator(m_compounds); ICompound *compoundById(const QString &id) const;
} virtual ICompound *compoundByName(const QString &name) const;
ICompound *compoundById(const QString &id) const virtual ICompound *memberById(const QString &id) const;
{ virtual ICompoundIterator *memberByName(const QString &name) const;
return m_compoundDict[id];
}
virtual ICompound *compoundByName(const QString &name) const
{
return name.isEmpty() ? 0 : m_compoundNameDict[name];
}
virtual IMember *memberById(const QString &id) const
{
return m_memberDict[id];
}
virtual IMemberIterator *memberByName(const QString &name) const
{
QList<IMember> *ml = m_memberNameDict[name];
if (ml==0) return 0;
return new MemberIterator(*ml);
}
virtual void release() { delete this; }
void insertMemberById(const QString &id,IMember *h);
void insertMemberByName(const QString &name,IMember *h);
void initialize(); virtual void release();
void setDebugLevel(int level);
bool readXMLDir(const char *dirName);
void dump();
void unloadCompound(CompoundHandler *ch);
private: private:
QList<ICompound> m_compounds; CompoundEntry *m_curCompound;
QDict<ICompound> m_compoundDict; MemberEntry *m_curMember;
QDict<ICompound> m_compoundNameDict; QList<CompoundEntry> m_compounds;
QDict<IMember> m_memberDict; QDict<CompoundEntry> m_compoundDict;
QDict<QList<IMember> > m_memberNameDict; QDict<CompoundEntry> m_compoundNameDict;
QDict<MemberEntry> m_memberDict;
QDict<QList<CompoundEntry> > m_memberNameDict;
QString m_xmlDirName;
QDict<CompoundHandler> m_compoundsLoaded;
}; };
#endif #endif
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -18,6 +18,53 @@ ...@@ -18,6 +18,53 @@
#include "dochandler.h" #include "dochandler.h"
#include "mainhandler.h" #include "mainhandler.h"
#include "linkedtexthandler.h" #include "linkedtexthandler.h"
#include "debug.h"
//------------------------------------------------------------------------------
class MemberTypeMap
{
public:
MemberTypeMap()
{
m_map.setAutoDelete(TRUE);
m_map.insert("define",new int(IMember::Define));
m_map.insert("property",new int(IMember::Property));
m_map.insert("variable",new int(IMember::Variable));
m_map.insert("typedef",new int(IMember::Typedef));
m_map.insert("enum",new int(IMember::Enum));
m_map.insert("function",new int(IMember::Function));
m_map.insert("signal",new int(IMember::Signal));
m_map.insert("prototype",new int(IMember::Prototype));
m_map.insert("friend",new int(IMember::Friend));
m_map.insert("dcop",new int(IMember::DCOP));
m_map.insert("slot",new int(IMember::Slot));
}
IMember::MemberKind map(const QString &s)
{
int *val = m_map.find(s);
if (val==0)
{
debug(1,"Warning: `%s' is an invalid member type\n",s.data());
return IMember::Invalid;
}
else return (IMember::MemberKind)*val;
}
private:
QDict<int> m_map;
};
static MemberTypeMap *s_typeMap;
void memberhandler_init()
{
s_typeMap = new MemberTypeMap;
}
void memberhandler_exit()
{
delete s_typeMap;
}
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -28,7 +75,8 @@ void MemberReference::initialize(MainHandler *mh) ...@@ -28,7 +75,8 @@ void MemberReference::initialize(MainHandler *mh)
IMember *MemberReference::member() const IMember *MemberReference::member() const
{ {
return m_mainHandler->memberById(m_memId); //return m_mainHandler->memberById(m_memId);
return 0;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -77,8 +125,9 @@ void EnumValueHandler::endInitializer() ...@@ -77,8 +125,9 @@ void EnumValueHandler::endInitializer()
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
MemberHandler::MemberHandler(IBaseHandler *parent) MemberHandler::MemberHandler(IBaseHandler *parent)
: m_parent(parent), m_brief(0), m_detailed(0) : m_parent(parent), m_compound(0), m_brief(0), m_detailed(0)
{ {
//printf("MemberHandler::MemberHandler() %p\n",this);
addEndHandler("memberdef",this,&MemberHandler::endMember); addEndHandler("memberdef",this,&MemberHandler::endMember);
addStartHandler("type",this,&MemberHandler::startType); addStartHandler("type",this,&MemberHandler::startType);
...@@ -110,6 +159,9 @@ MemberHandler::MemberHandler(IBaseHandler *parent) ...@@ -110,6 +159,9 @@ MemberHandler::MemberHandler(IBaseHandler *parent)
addStartHandler("location",this,&MemberHandler::startLocation); addStartHandler("location",this,&MemberHandler::startLocation);
addEndHandler("location"); addEndHandler("location");
m_type.setAutoDelete(TRUE);
m_initializer.setAutoDelete(TRUE);
m_exception.setAutoDelete(TRUE);
m_params.setAutoDelete(TRUE); m_params.setAutoDelete(TRUE);
m_references.setAutoDelete(TRUE); m_references.setAutoDelete(TRUE);
m_referencedBy.setAutoDelete(TRUE); m_referencedBy.setAutoDelete(TRUE);
...@@ -124,22 +176,25 @@ MemberHandler::MemberHandler(IBaseHandler *parent) ...@@ -124,22 +176,25 @@ MemberHandler::MemberHandler(IBaseHandler *parent)
MemberHandler::~MemberHandler() MemberHandler::~MemberHandler()
{ {
debug(2,"MemberHandler::~MemberHandler() %p\n",this);
delete m_brief; delete m_brief;
delete m_detailed; delete m_detailed;
delete m_linkedTextHandler; delete m_linkedTextHandler;
delete m_reimplements;
} }
void MemberHandler::startMember(const QXmlAttributes& attrib) void MemberHandler::startMember(const QXmlAttributes& attrib)
{ {
m_parent->setDelegate(this); m_parent->setDelegate(this);
m_kind = attrib.value("kind"); m_kindString = attrib.value("kind");
m_kind = s_typeMap->map(m_kindString);
m_id = attrib.value("id"); m_id = attrib.value("id");
m_virtualness = attrib.value("virt"); m_virtualness = attrib.value("virt");
m_protection = attrib.value("prot"); m_protection = attrib.value("prot");
m_isConst = attrib.value("const")=="yes"; m_isConst = attrib.value("const")=="yes";
m_isVolatile = attrib.value("volatile")=="yes"; m_isVolatile = attrib.value("volatile")=="yes";
printf("member kind=`%s' id=`%s' prot=`%s' virt=`%s'\n", debug(2,"member kind=`%s' id=`%s' prot=`%s' virt=`%s'\n",
m_kind.data(),m_id.data(),m_protection.data(),m_virtualness.data()); m_kindString.data(),m_id.data(),m_protection.data(),m_virtualness.data());
} }
void MemberHandler::startBriefDesc(const QXmlAttributes& attrib) void MemberHandler::startBriefDesc(const QXmlAttributes& attrib)
...@@ -226,7 +281,7 @@ void MemberHandler::endMember() ...@@ -226,7 +281,7 @@ void MemberHandler::endMember()
void MemberHandler::startType(const QXmlAttributes &) void MemberHandler::startType(const QXmlAttributes &)
{ {
printf("startType!\n"); debug(2,"startType!\n");
delete m_linkedTextHandler; delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_type); m_linkedTextHandler = new LinkedTextHandler(this,m_type);
m_linkedTextHandler->start("type"); m_linkedTextHandler->start("type");
...@@ -234,7 +289,7 @@ void MemberHandler::startType(const QXmlAttributes &) ...@@ -234,7 +289,7 @@ void MemberHandler::startType(const QXmlAttributes &)
void MemberHandler::startInitializer(const QXmlAttributes &) void MemberHandler::startInitializer(const QXmlAttributes &)
{ {
printf("startInitializer!\n"); debug(2,"startInitializer!\n");
delete m_linkedTextHandler; delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_initializer); m_linkedTextHandler = new LinkedTextHandler(this,m_initializer);
m_linkedTextHandler->start("initializer"); m_linkedTextHandler->start("initializer");
...@@ -242,7 +297,7 @@ void MemberHandler::startInitializer(const QXmlAttributes &) ...@@ -242,7 +297,7 @@ void MemberHandler::startInitializer(const QXmlAttributes &)
void MemberHandler::startException(const QXmlAttributes &) void MemberHandler::startException(const QXmlAttributes &)
{ {
printf("startException!\n"); debug(2,"startException!\n");
delete m_linkedTextHandler; delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_exception); m_linkedTextHandler = new LinkedTextHandler(this,m_exception);
m_linkedTextHandler->start("exception"); m_linkedTextHandler->start("exception");
...@@ -251,7 +306,7 @@ void MemberHandler::startException(const QXmlAttributes &) ...@@ -251,7 +306,7 @@ void MemberHandler::startException(const QXmlAttributes &)
void MemberHandler::endName() void MemberHandler::endName()
{ {
m_name = m_curString.stripWhiteSpace(); m_name = m_curString.stripWhiteSpace();
printf("member name=`%s'\n",m_name.data()); debug(2,"member name=`%s'\n",m_name.data());
} }
void MemberHandler::startParam(const QXmlAttributes& attrib) void MemberHandler::startParam(const QXmlAttributes& attrib)
...@@ -297,3 +352,25 @@ void MemberHandler::initialize(MainHandler *mh) ...@@ -297,3 +352,25 @@ void MemberHandler::initialize(MainHandler *mh)
if (m_reimplements) m_reimplements->initialize(mh); if (m_reimplements) m_reimplements->initialize(mh);
} }
void MemberHandler::setCompoundHandler(CompoundHandler *c)
{
m_compound = c;
}
ICompound *MemberHandler::compound() const
{
m_compound->addref();
return m_compound;
}
void MemberHandler::setSectionHandler(SectionHandler *c)
{
m_section = c;
}
ISection *MemberHandler::section() const
{
return m_section;
}
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -28,6 +28,8 @@ ...@@ -28,6 +28,8 @@
#include "dochandler.h" #include "dochandler.h"
class MainHandler; class MainHandler;
class CompoundHandler;
class SectionHandler;
struct MemberReference : public IMemberReference struct MemberReference : public IMemberReference
{ {
...@@ -48,13 +50,6 @@ class MemberReferenceIterator : public BaseIterator<IMemberReferenceIterator,IMe ...@@ -48,13 +50,6 @@ class MemberReferenceIterator : public BaseIterator<IMemberReferenceIterator,IMe
BaseIterator<IMemberReferenceIterator,IMemberReference,MemberReference>(list) {} BaseIterator<IMemberReferenceIterator,IMemberReference,MemberReference>(list) {}
}; };
class MemberIterator : public BaseIterator<IMemberIterator,IMember,IMember>
{
public:
MemberIterator(const QList<IMember> &list) :
BaseIterator<IMemberIterator,IMember,IMember>(list) {}
};
class EnumValueHandler : public IEnumValue, public BaseHandler<EnumValueHandler> class EnumValueHandler : public IEnumValue, public BaseHandler<EnumValueHandler>
{ {
public: public:
...@@ -116,8 +111,12 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler> ...@@ -116,8 +111,12 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler>
virtual ~MemberHandler(); virtual ~MemberHandler();
// IMember implementation // IMember implementation
virtual QString kind() const virtual ICompound *compound() const;
virtual ISection *section() const;
virtual MemberKind kind() const
{ return m_kind; } { return m_kind; }
virtual QString kindString() const
{ return m_kindString; }
virtual QString id() const virtual QString id() const
{ return m_id; } { return m_id; }
virtual QString protection() const virtual QString protection() const
...@@ -132,6 +131,8 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler> ...@@ -132,6 +131,8 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler>
{ return m_isVolatile; } { return m_isVolatile; }
virtual ILinkedTextIterator *type() const virtual ILinkedTextIterator *type() const
{ return new LinkedTextIterator(m_type); } { return new LinkedTextIterator(m_type); }
virtual QString typeString() const
{ return LinkedTextHandler::toString(m_type); }
virtual IParamIterator *params() const virtual IParamIterator *params() const
{ return new ParamIterator(m_params); } { return new ParamIterator(m_params); }
virtual IMemberReferenceIterator *references() const virtual IMemberReferenceIterator *references() const
...@@ -162,10 +163,15 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler> ...@@ -162,10 +163,15 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler>
{ return m_detailed; } { return m_detailed; }
void initialize(MainHandler *m); void initialize(MainHandler *m);
void setCompoundHandler(CompoundHandler *c);
void setSectionHandler(SectionHandler *s);
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_kind; CompoundHandler *m_compound;
SectionHandler *m_section;
MemberKind m_kind;
QString m_kindString;
QString m_id; QString m_id;
QString m_protection; QString m_protection;
QString m_virtualness; QString m_virtualness;
...@@ -190,4 +196,14 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler> ...@@ -190,4 +196,14 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler>
QList<EnumValueHandler> m_enumValues; QList<EnumValueHandler> m_enumValues;
}; };
class MemberIterator : public BaseIterator<IMemberIterator,IMember,MemberHandler>
{
public:
MemberIterator(const QList<MemberHandler> &list) :
BaseIterator<IMemberIterator,IMember,MemberHandler>(list) {}
};
void memberhandler_init();
void memberhandler_exit();
#endif #endif
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "paramhandler.h" #include "paramhandler.h"
#include "memberhandler.h" #include "memberhandler.h"
#include "debug.h"
ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent) ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent)
{ {
...@@ -41,12 +42,13 @@ ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent) ...@@ -41,12 +42,13 @@ ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent)
ParamHandler::~ParamHandler() ParamHandler::~ParamHandler()
{ {
delete m_linkedTextHandler;
} }
void ParamHandler::startParam(const QXmlAttributes& /*attrib*/) void ParamHandler::startParam(const QXmlAttributes& /*attrib*/)
{ {
m_parent->setDelegate(this); m_parent->setDelegate(this);
printf("param\n"); debug(2,"param\n");
} }
void ParamHandler::endParam() void ParamHandler::endParam()
...@@ -59,39 +61,39 @@ void ParamHandler::startType(const QXmlAttributes& /*attrib*/) ...@@ -59,39 +61,39 @@ void ParamHandler::startType(const QXmlAttributes& /*attrib*/)
delete m_linkedTextHandler; delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_type); m_linkedTextHandler = new LinkedTextHandler(this,m_type);
m_linkedTextHandler->start("type"); m_linkedTextHandler->start("type");
printf("param type\n"); debug(2,"param type\n");
} }
void ParamHandler::endDeclName() void ParamHandler::endDeclName()
{ {
m_declName = m_curString.stripWhiteSpace(); m_declName = m_curString.stripWhiteSpace();
printf("member declName=`%s'\n",m_declName.data()); debug(2,"member declName=`%s'\n",m_declName.data());
} }
void ParamHandler::endDefName() void ParamHandler::endDefName()
{ {
m_defName = m_curString.stripWhiteSpace(); m_defName = m_curString.stripWhiteSpace();
printf("member defName=`%s'\n",m_defName.data()); debug(2,"member defName=`%s'\n",m_defName.data());
} }
void ParamHandler::endAttrib() void ParamHandler::endAttrib()
{ {
m_attrib = m_curString.stripWhiteSpace(); m_attrib = m_curString.stripWhiteSpace();
printf("member attrib=`%s'\n",m_attrib.data()); debug(2,"member attrib=`%s'\n",m_attrib.data());
} }
void ParamHandler::endArray() void ParamHandler::endArray()
{ {
m_array = m_curString.stripWhiteSpace(); m_array = m_curString.stripWhiteSpace();
printf("member array=`%s'\n",m_array.data()); debug(2,"member array=`%s'\n",m_array.data());
} }
void ParamHandler::startDefVal(const QXmlAttributes& /*attrib*/) void ParamHandler::startDefVal(const QXmlAttributes& /*attrib*/)
{ {
delete m_linkedTextHandler; delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_defVal); m_linkedTextHandler = new LinkedTextHandler(this,m_defVal);
m_linkedTextHandler->start("type"); m_linkedTextHandler->start("defval");
printf("member defVal\n"); debug(2,"member defVal\n");
} }
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -16,9 +16,74 @@ ...@@ -16,9 +16,74 @@
#include "mainhandler.h" #include "mainhandler.h"
#include "compoundhandler.h" #include "compoundhandler.h"
#include "sectionhandler.h" #include "sectionhandler.h"
#include "debug.h"
class SectionTypeMap
{
public:
SectionTypeMap() : m_map(37)
{
m_map.setAutoDelete(TRUE);
m_map.insert("user-defined",new int(ISection::UserDefined));
m_map.insert("public-type",new int(ISection::PubTypes));
m_map.insert("public-func",new int(ISection::PubFuncs));
m_map.insert("public-attrib",new int(ISection::PubAttribs));
m_map.insert("public-slot",new int(ISection::PubSlots));
m_map.insert("signal",new int(ISection::Signals));
m_map.insert("dcop-func",new int(ISection::DCOPFuncs));
m_map.insert("property",new int(ISection::Properties));
m_map.insert("public-static-func",new int(ISection::PubStatFuncs));
m_map.insert("public-static-attrib",new int(ISection::PubStatAttribs));
m_map.insert("protected-type",new int(ISection::ProTypes));
m_map.insert("protected-func",new int(ISection::ProFuncs));
m_map.insert("protected-attrib",new int(ISection::ProAttribs));
m_map.insert("protected-slot",new int(ISection::ProSlots));
m_map.insert("protected-static-func",new int(ISection::ProStatFuncs));
m_map.insert("protected-static-attrib",new int(ISection::ProStatAttribs));
m_map.insert("private-type",new int(ISection::PriTypes));
m_map.insert("private-func",new int(ISection::PriFuncs));
m_map.insert("private-attrib",new int(ISection::PriAttribs));
m_map.insert("private-slot",new int(ISection::PriSlots));
m_map.insert("private-static-func",new int(ISection::PriStatFuncs));
m_map.insert("private-static-attrib",new int(ISection::PriStatAttribs));
m_map.insert("friend",new int(ISection::Friend));
m_map.insert("related",new int(ISection::Related));
m_map.insert("define",new int(ISection::Defines));
m_map.insert("prototype",new int(ISection::Prototypes));
m_map.insert("typedef",new int(ISection::Typedefs));
m_map.insert("enum",new int(ISection::Enums));
m_map.insert("func",new int(ISection::Functions));
m_map.insert("var",new int(ISection::Variables));
}
ISection::SectionKind map(const QString &s)
{
int *val = m_map.find(s);
if (val==0)
{
debug(1,"Warning: `%s' is an invalid section type\n",s.data());
return ISection::Invalid;
}
else return (ISection::SectionKind)*val;
}
private:
QDict<int> m_map;
};
static SectionTypeMap *s_typeMap;
void sectionhandler_init()
{
s_typeMap = new SectionTypeMap;
}
void sectionhandler_exit()
{
delete s_typeMap;
}
SectionHandler::SectionHandler(IBaseHandler *parent) : m_parent(parent) SectionHandler::SectionHandler(IBaseHandler *parent) : m_parent(parent)
{ {
//printf("SectionHandler::SectionHandler()\n");
m_members.setAutoDelete(TRUE); m_members.setAutoDelete(TRUE);
addEndHandler("sectiondef",this,&SectionHandler::endSection); addEndHandler("sectiondef",this,&SectionHandler::endSection);
addStartHandler("memberdef",this,&SectionHandler::startMember); addStartHandler("memberdef",this,&SectionHandler::startMember);
...@@ -26,13 +91,15 @@ SectionHandler::SectionHandler(IBaseHandler *parent) : m_parent(parent) ...@@ -26,13 +91,15 @@ SectionHandler::SectionHandler(IBaseHandler *parent) : m_parent(parent)
SectionHandler::~SectionHandler() SectionHandler::~SectionHandler()
{ {
debug(2,"SectionHandler::~SectionHandler()\n");
} }
void SectionHandler::startSection(const QXmlAttributes& attrib) void SectionHandler::startSection(const QXmlAttributes& attrib)
{ {
m_parent->setDelegate(this); m_parent->setDelegate(this);
m_kind = attrib.value("kind"); m_kindString = attrib.value("kind");
printf("section kind=`%s'\n",m_kind.data()); m_kind = s_typeMap->map(m_kindString);
debug(2,"section kind=`%s'\n",m_kindString.data());
} }
void SectionHandler::endSection() void SectionHandler::endSection()
...@@ -47,14 +114,15 @@ void SectionHandler::startMember(const QXmlAttributes& attrib) ...@@ -47,14 +114,15 @@ void SectionHandler::startMember(const QXmlAttributes& attrib)
m_members.append(memHandler); m_members.append(memHandler);
} }
void SectionHandler::initialize(MainHandler *m) void SectionHandler::initialize(CompoundHandler *ch)
{ {
QListIterator<IMember> mli(m_members); QListIterator<MemberHandler> mli(m_members);
MemberHandler *mh; MemberHandler *mh;
for (;(mh=(MemberHandler *)mli.current());++mli) for (;(mh=mli.current());++mli)
{ {
m->insertMemberById(mh->id(),mh); mh->setCompoundHandler(ch);
m->insertMemberByName(mh->name(),mh); ch->insertMember(mh);
mh->setSectionHandler(this);
} }
} }
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -47,16 +47,43 @@ class SectionHandler : public ISection, public BaseHandler<SectionHandler> ...@@ -47,16 +47,43 @@ class SectionHandler : public ISection, public BaseHandler<SectionHandler>
virtual ~SectionHandler(); virtual ~SectionHandler();
// ISection // ISection
virtual QString kind() const { return m_kind; } virtual QString kindString() const
{ return m_kindString; }
virtual SectionKind kind() const
{ return m_kind; }
virtual IMemberIterator *members() const virtual IMemberIterator *members() const
{ return new MemberIterator(m_members); } { return new MemberIterator(m_members); }
virtual bool isStatic() const
{
return m_kind==PubStatFuncs || m_kind==PubStatAttribs ||
m_kind==ProStatFuncs || m_kind==ProStatAttribs ||
m_kind==PriStatFuncs || m_kind==PriStatAttribs;
}
virtual bool isPublic() const
{
return !isProtected() && !isPrivate();
}
virtual bool isProtected() const
{
return m_kind==ProTypes || m_kind==ProFuncs || m_kind==ProAttribs ||
m_kind==ProSlots || m_kind==ProStatFuncs || m_kind==ProStatAttribs;
}
virtual bool isPrivate() const
{
return m_kind==PriTypes || m_kind==PriFuncs || m_kind==PriAttribs ||
m_kind==PriSlots || m_kind==PriStatFuncs || m_kind==PriStatAttribs;
}
void initialize(MainHandler *m); void initialize(CompoundHandler *c);
private: private:
IBaseHandler *m_parent; IBaseHandler *m_parent;
QString m_kind; SectionKind m_kind;
QList<IMember> m_members; QString m_kindString;
QList<MemberHandler> m_members;
}; };
void sectionhandler_init();
void sectionhandler_exit();
#endif #endif
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* $Id$ * $Id$
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -312,11 +312,17 @@ int main(int argc,char **argv) ...@@ -312,11 +312,17 @@ int main(int argc,char **argv)
{ {
if (argc!=2) if (argc!=2)
{ {
printf("Usage: %s file.xml\n",argv[0]); printf("Usage: %s xmldir\n",argv[0]);
exit(1); exit(1);
} }
IDoxygen *dox = createObjectModelFromXML(argv[1]); IDoxygen *dox = createObjectModel();
if (!dox->readXMLDir(argv[1]))
{
printf("Error reading %s/index.xml\n",argv[1]);
exit(1);
}
ICompoundIterator *cli = dox->compounds(); ICompoundIterator *cli = dox->compounds();
ICompound *comp; ICompound *comp;
...@@ -324,12 +330,12 @@ int main(int argc,char **argv) ...@@ -324,12 +330,12 @@ int main(int argc,char **argv)
for (cli->toFirst();(comp=cli->current());cli->toNext()) for (cli->toFirst();(comp=cli->current());cli->toNext())
{ {
printf("Compound name=%s id=%s kind=%s\n", printf("Compound name=%s id=%s kind=%s\n",
comp->name().data(),comp->id().data(),comp->kind().data()); comp->name().data(),comp->id().data(),comp->kindString().data());
ISectionIterator *sli = comp->sections(); ISectionIterator *sli = comp->sections();
ISection *sec; ISection *sec;
for (sli->toFirst();(sec=sli->current());sli->toNext()) for (sli->toFirst();(sec=sli->current());sli->toNext())
{ {
printf(" Section kind=%s\n",sec->kind().data()); printf(" Section kind=%s\n",sec->kindString().data());
IMemberIterator *mli = sec->members(); IMemberIterator *mli = sec->members();
IMember *mem; IMember *mem;
for (mli->toFirst();(mem=mli->current());mli->toNext()) for (mli->toFirst();(mem=mli->current());mli->toNext())
...@@ -412,6 +418,7 @@ int main(int argc,char **argv) ...@@ -412,6 +418,7 @@ int main(int argc,char **argv)
printf("===== detailed description ==== \n"); printf("===== detailed description ==== \n");
DumpDoc(doc); DumpDoc(doc);
} }
comp->release();
} }
cli->release(); cli->release();
printf("---------------------------\n"); printf("---------------------------\n");
......
# #
# #
# #
# Copyright (C) 1997-2001 by Dimitri van Heesch. # Copyright (C) 1997-2002 by Dimitri van Heesch.
# #
# Permission to use, copy, modify, and distribute this software and its # Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby # documentation under the terms of the GNU General Public License is hereby
......
# #
# #
# #
# Copyright (C) 1997-2001 by Dimitri van Heesch. # Copyright (C) 1997-2002 by Dimitri van Heesch.
# #
# Permission to use, copy, modify, and distribute this software and its # Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby # documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
# #
# #
# #
# Copyright (C) 1997-2001 by Dimitri van Heesch. # Copyright (C) 1997-2002 by Dimitri van Heesch.
# #
# Permission to use, copy, modify, and distribute this software and its # Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby # documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -415,7 +415,7 @@ TMAKE_CXXFLAGS += -DENGLISH_ONLY ...@@ -415,7 +415,7 @@ TMAKE_CXXFLAGS += -DENGLISH_ONLY
EOF EOF
fi fi
f_inmakefiles="Makefile.in qtools/Makefile.in src/Makefile.in examples/Makefile.in doc/Makefile.in addon/doxywizard/Makefile.in addon/doxmlparser/src/Makefile.in addon/doxmlparser/test/Makefile.in" f_inmakefiles="Makefile.in qtools/Makefile.in src/Makefile.in examples/Makefile.in doc/Makefile.in addon/doxywizard/Makefile.in addon/doxmlparser/src/Makefile.in addon/doxmlparser/test/Makefile.in addon/doxmlparser/examples/metrics/Makefile.in"
for i in $f_inmakefiles ; do for i in $f_inmakefiles ; do
SRC=$i SRC=$i
...@@ -447,7 +447,7 @@ EOF ...@@ -447,7 +447,7 @@ EOF
echo " Created $DST from $SRC..." echo " Created $DST from $SRC..."
done done
f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in src/doxytag.pro.in src/doxysearch.pro.in addon/doxywizard/doxywizard.pro.in addon/doxmlparser/src/doxmlparser.pro.in addon/doxmlparser/test/xmlparse.pro.in" f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in src/doxytag.pro.in src/doxysearch.pro.in addon/doxywizard/doxywizard.pro.in addon/doxmlparser/src/doxmlparser.pro.in addon/doxmlparser/test/xmlparse.pro.in addon/doxmlparser/examples/metrics/metrics.pro.in"
for i in $f_inprofiles ; do for i in $f_inprofiles ; do
SRC=$i SRC=$i
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
# input used in their production; they are not affected by this license. # input used in their production; they are not affected by this license.
all: language FORCE all: language FORCE
@xcopy /y /s /q /i ..\examples ..\html\examples @xcopy /s /q /i ..\examples ..\html\examples
set DOXYGEN_DOCDIR=. & \ set DOXYGEN_DOCDIR=. & \
set VERSION=$(VERSION) & \ set VERSION=$(VERSION) & \
$(DOXYGEN)\bin\doxygen $(DOXYGEN)\bin\doxygen
......
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
# input used in their production; they are not affected by this license. # input used in their production; they are not affected by this license.
all: language FORCE all: language FORCE
@xcopy /y /s /q /i ..\examples ..\html\examples @xcopy /s /q /i ..\examples ..\html\examples
set DOXYGEN_DOCDIR=. set DOXYGEN_DOCDIR=.
set VERSION=$(VERSION) set VERSION=$(VERSION)
$(DOXYGEN)\bin\doxygen $(DOXYGEN)\bin\doxygen
......
...@@ -93,9 +93,11 @@ followed by the descriptions of the tags grouped by category. ...@@ -93,9 +93,11 @@ followed by the descriptions of the tags grouped by category.
<li> \refitem cfg_example_recursive EXAMPLE_RECURSIVE <li> \refitem cfg_example_recursive EXAMPLE_RECURSIVE
<li> \refitem cfg_exclude EXCLUDE <li> \refitem cfg_exclude EXCLUDE
<li> \refitem cfg_exclude_patterns EXCLUDE_PATTERNS <li> \refitem cfg_exclude_patterns EXCLUDE_PATTERNS
<li> \refitem cfg_exclude_symlinks EXCLUDE_SYMLINKS
<li> \refitem cfg_expand_as_defined EXPAND_AS_DEFINED <li> \refitem cfg_expand_as_defined EXPAND_AS_DEFINED
<li> \refitem cfg_expand_only_predef EXPAND_ONLY_PREDEF <li> \refitem cfg_expand_only_predef EXPAND_ONLY_PREDEF
<li> \refitem cfg_ext_doc_paths EXT_DOC_PATHS <li> \refitem cfg_ext_doc_paths EXT_DOC_PATHS
<li> \refitem cfg_external_groups EXTERNAL_GROUPS
<li> \refitem cfg_extra_packages EXTRA_PACKAGES <li> \refitem cfg_extra_packages EXTRA_PACKAGES
<li> \refitem cfg_extract_all EXTRACT_ALL <li> \refitem cfg_extract_all EXTRACT_ALL
<li> \refitem cfg_extract_local_classes EXTRACT_LOCAL_CLASSES <li> \refitem cfg_extract_local_classes EXTRACT_LOCAL_CLASSES
...@@ -567,8 +569,11 @@ followed by the descriptions of the tags grouped by category. ...@@ -567,8 +569,11 @@ followed by the descriptions of the tags grouped by category.
If the value of the \c INPUT tag contains directories, you can use the If the value of the \c INPUT tag contains directories, you can use the
\c FILE_PATTERNS tag to specify one or more wildcard patterns \c FILE_PATTERNS tag to specify one or more wildcard patterns
(like \c *.cpp and \c *.h ) to filter out the source-files (like \c *.cpp and \c *.h ) to filter out the source-files
in the directories. If left blank all files are included in the directories. If left blank the following patterns are tested:
(i.e. wildcard <tt>*</tt>). <code>
*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
*.h++ *.idl *.odl
</code>
\anchor cfg_recursive \anchor cfg_recursive
<dt>\c RECURSIVE <dd> <dt>\c RECURSIVE <dd>
...@@ -584,6 +589,12 @@ followed by the descriptions of the tags grouped by category. ...@@ -584,6 +589,12 @@ followed by the descriptions of the tags grouped by category.
excluded from the \c INPUT source files. This way you can easily exclude a excluded from the \c INPUT source files. This way you can easily exclude a
subdirectory from a directory tree whose root is specified with the \c INPUT tag. subdirectory from a directory tree whose root is specified with the \c INPUT tag.
\anchor cfg_exclude_symlinks
<dt>\c EXCLUDE_SYMLINKS <dd>
\addindex EXCLUDE_SYMLINKS
The \c EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
that are symbolic links (a Unix filesystem feature) are excluded from the input.
\anchor cfg_exclude_patterns \anchor cfg_exclude_patterns
<dt>\c EXCLUDE_PATTERNS <dd> <dt>\c EXCLUDE_PATTERNS <dd>
\addindex EXCLUDE_PATTERNS \addindex EXCLUDE_PATTERNS
...@@ -1168,6 +1179,13 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre> ...@@ -1168,6 +1179,13 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
in the class index. If set to \c NO only the inherited external classes in the class index. If set to \c NO only the inherited external classes
will be listed. will be listed.
\anchor cfg_external_groups
<dt>\c EXTERNAL_GROUPS <dd>
\addindex EXTERNAL_GROUPS
If the \c EXTERNAL_GROUPS tag is set to \c YES all external groups will be listed
in the modules index. If set to \c NO, only the current project's groups will
be listed.
\anchor cfg_perl_path \anchor cfg_perl_path
<dt>\c PERL_PATH <dd> <dt>\c PERL_PATH <dd>
\addindex PERL_PATH \addindex PERL_PATH
......
...@@ -66,6 +66,9 @@ tools should be installed. ...@@ -66,6 +66,9 @@ tools should be installed.
\latexonly(see {\tt http://www.research.att.com/sw/tools/graphviz/})\endlatexonly. \latexonly(see {\tt http://www.research.att.com/sw/tools/graphviz/})\endlatexonly.
Needed for the include dependency graphs, Needed for the include dependency graphs,
the graphical inheritance graphs, and the collaboration graphs. the graphical inheritance graphs, and the collaboration graphs.
\note If you compile graphviz yourself, make sure you do include
freetype support (which requires the freetype library and header files),
otherwise dot will produce a warning that it cannot find doxfont!
<li>The ghostscript interpreter. <li>The ghostscript interpreter.
</ul> </ul>
......
...@@ -60,7 +60,7 @@ when the translator was updated. ...@@ -60,7 +60,7 @@ when the translator was updated.
<TD>Chinese</TD> <TD>Chinese</TD>
<TD>Wei Liu<br>Wang Weihan</TD> <TD>Wei Liu<br>Wang Weihan</TD>
<TD>liuwei@NOSPAM.asiainfo.com<br>wangweihan@NOSPAM.capinfo.com.cn</TD> <TD>liuwei@NOSPAM.asiainfo.com<br>wangweihan@NOSPAM.capinfo.com.cn</TD>
<TD>1.2.11</TD> <TD>up-to-date</TD>
</TR> </TR>
<TR BGCOLOR="#ffffff"> <TR BGCOLOR="#ffffff">
<TD>Croatian</TD> <TD>Croatian</TD>
...@@ -213,7 +213,7 @@ when the translator was updated. ...@@ -213,7 +213,7 @@ when the translator was updated.
\hline \hline
Brazilian & Fabio "FJTC" Jun Takada Chino & {\tt chino@icmc.sc.usp.br} & up-to-date \\ Brazilian & Fabio "FJTC" Jun Takada Chino & {\tt chino@icmc.sc.usp.br} & up-to-date \\
\hline \hline
Chinese & Wei Liu & {\tt liuwei@asiainfo.com} & 1.2.11 \\ Chinese & Wei Liu & {\tt liuwei@asiainfo.com} & up-to-date \\
& Wang Weihan & {\tt wangweihan@capinfo.com.cn} & \\ & Wang Weihan & {\tt wangweihan@capinfo.com.cn} & \\
\hline \hline
Croatian & Boris Bralo & {\tt boris.bralo@zg.tel.hr} & up-to-date \\ Croatian & Boris Bralo & {\tt boris.bralo@zg.tel.hr} & up-to-date \\
...@@ -527,10 +527,24 @@ translator adapter, that is used as your base class. When there is ...@@ -527,10 +527,24 @@ translator adapter, that is used as your base class. When there is
not such a method in your translator adapter base class, you probably not such a method in your translator adapter base class, you probably
can change the translator adapter base to the newer one. can change the translator adapter base to the newer one.
Do not blindly implement all methods that are implemented by your Probably the easiest approach of the gradual update is to look at
translator adapter base class. The reason is that the adapter the translator report to the part where the list of the implemented
translator adapters is shown. Then:
- Look how many required methods each adapter implements and guess
how many methods you are willing to update (to spend the time
with).
- Choose the related oldest translator adapters to be removed (i.e.
not used by your translator).
- Change the base class of your translator class to the translator
adapter that you want to use.
- Implement the methods that were implemented by the older translator
adapters.
Notice: Do not blindly implement all methods that are implemented by
your translator adapter base class. The reason is that the adapter
classes implement also obsolete methods. Another reason is that classes implement also obsolete methods. Another reason is that
some of the methods could become obsolete from some newer adapter on. some of the methods could become obsolete from some newer adapter
on. Focus on the methods listed as \e required.
<b>The really obsolete language translators</b> may lead to too much <b>The really obsolete language translators</b> may lead to too much
complicated adapters. Because of that, doxygen developers may decide complicated adapters. Because of that, doxygen developers may decide
......
...@@ -291,10 +291,24 @@ translator adapter, that is used as your base class. When there is ...@@ -291,10 +291,24 @@ translator adapter, that is used as your base class. When there is
not such a method in your translator adapter base class, you probably not such a method in your translator adapter base class, you probably
can change the translator adapter base to the newer one. can change the translator adapter base to the newer one.
Do not blindly implement all methods that are implemented by your Probably the easiest approach of the gradual update is to look at
translator adapter base class. The reason is that the adapter the translator report to the part where the list of the implemented
translator adapters is shown. Then:
- Look how many required methods each adapter implements and guess
how many methods you are willing to update (to spend the time
with).
- Choose the related oldest translator adapters to be removed (i.e.
not used by your translator).
- Change the base class of your translator class to the translator
adapter that you want to use.
- Implement the methods that were implemented by the older translator
adapters.
Notice: Do not blindly implement all methods that are implemented by
your translator adapter base class. The reason is that the adapter
classes implement also obsolete methods. Another reason is that classes implement also obsolete methods. Another reason is that
some of the methods could become obsolete from some newer adapter on. some of the methods could become obsolete from some newer adapter
on. Focus on the methods listed as \e required.
<b>The really obsolete language translators</b> may lead to too much <b>The really obsolete language translators</b> may lead to too much
complicated adapters. Because of that, doxygen developers may decide complicated adapters. Because of that, doxygen developers may decide
......
...@@ -95,6 +95,21 @@ ...@@ -95,6 +95,21 @@
# as "obsolete" in the status (i.e. no guessing when it was last updated). # as "obsolete" in the status (i.e. no guessing when it was last updated).
# The translator report include the notice about that situation. # The translator report include the notice about that situation.
# #
# 2002/01/03
# - Minor correction of regexp to obtain the list of translator_xx.h files.
# - Translator report ASCII file now lists the implemented translator
# adapter classes; so you can check how many steps behind the up-to-date
# status your translator is.
#
# 2002/01/07
# - The list of the implemented translator-adapter classes now shows
# how many and what required methods the translator adapter implements.
#
# 2002/01/08
# - The mistake in comments inside the translator report corrected.
# The older translator adapters are derived from newer ones.
# The mistaken comment said the opposite.
#
################################################################ ################################################################
use 5.005; use 5.005;
...@@ -193,7 +208,7 @@ sub GetPureVirtualFrom ##{{{ ...@@ -193,7 +208,7 @@ sub GetPureVirtualFrom ##{{{
################################################################ ################################################################
# StripArgIdentifiers takes a method prototype (one line string), # StripArgIdentifiers takes a method prototype (one line string),
# removes the argument identifiers, and returns only the necessary # removes the argument identifiers, and returns only the necessary
# form of the prototype. # form of the prototype as the function result.
# #
sub StripArgIdentifiers ##{{{ sub StripArgIdentifiers ##{{{
{ {
...@@ -234,7 +249,7 @@ sub StripArgIdentifiers ##{{{ ...@@ -234,7 +249,7 @@ sub StripArgIdentifiers ##{{{
# Whitespaces are not only spaces. Moreover, the difference # Whitespaces are not only spaces. Moreover, the difference
# may be in number of them in a sequence or in the type # may be in number of them in a sequence or in the type
# of a whitespace. This is the reason to replace each sequence # of a whitespace. This is the reason to replace each sequence
# of whitespace by a single, real space. # of whitespaces by a single, real space.
# #
$arg =~ s{\s+}{ }g; $arg =~ s{\s+}{ }g;
...@@ -345,6 +360,149 @@ sub GetInfoFrom ##{{{ ...@@ -345,6 +360,149 @@ sub GetInfoFrom ##{{{
##}}} ##}}}
################################################################
# GetAdapterClassesInfo returns the list of strings with information
# related to the adapter classes. Each one-line string contains the
# identifier of the adapter class and the number of required methods
# that are implemented by the adapter.
#
# The function takes one agument -- the reference to the hash with
# stripped prototypes of the required methods.
#
sub GetAdapterClassesInfo ##{{{
{
# Get the reference to the hash with required prototypes.
#
my $reqref = shift;
# Let's open the file with the translator adapter classes.
#
my $fin = "$srcdir/translator_adapter.h";
open(FIN, "< $fin") or die "\nError when open < $fin: $!";
my @content = <FIN>;
close FIN;
my $cont = join("", @content);
# Prepare the list that will be returned as result.
#
my @result = ();
# Remove the preprocessor directives.
#
$cont =~ s{^\s*#\w+.+$}{}mg;
# Remove comments and empty lines.
#
$cont =~ s{\s*//.*$}{}mg; # remove one-line comments
$cont =~ s{/\*.+?\*/}{}sg; # remove C comments
$cont =~ s{\n\s*\n}{\n}sg; # remove empty lines
# Place delimiters to separate the classes, and remove
# the TranslatorAdapterBase class.
#
$cont =~ s{\};\s*class\s+}{<class>}sg;
$cont =~ s{class\s+TranslatorAdapterBase\s+.+?<class>}{<class>}s;
$cont =~ s{\};}{}sg;
# Remove the base classes and the beginning of the the class
# definitions.
#
$cont =~ s{(TranslatorAdapter[_0-9]+)\s*:.+?\{\s*(public\s*:)?}{$1}sg;
# Remove all bodies of methods;
#
while ($cont =~ s/{[^{}]+?}//sg) {}
# Remove the "virtual" keywords.
#
$cont =~ s{^\s*virtual\s+}{}mg;
# Remove the empty lines.
#
$cont =~ s{\n\s*\n}{\n}sg;
# Split the string into the lines again.
#
@content = split(/\n/, $cont);
# Now the list contains only two kinds of lines. The first
# kind of lines starts with the <class> tag and contains the
# identifier of the class. The following lines list the
# non-stripped prototypes of implemented methods without the
# "virtual" keyword.
#
# Now we will produce the result by looping through all the
# lines and counting the prototypes of the required methods
# that are implemented by the adapter class.
#
my $info = '';
my $cnt = 0;
my $methods = '';
foreach my $line (@content)
{
if ($line =~ m{^<class>(\w+)\s*$}i )
{
# Another adapter class found.
#
my $adapter_class = $1;
# If the $info is not empty then it contains partial
# information about the previously processed adapter.
#
if ($info ne '')
{
# Complete the $info and push it into the @result.
#
$info .= sprintf("\timplements %2d required method%s...\n",
$cnt, (($cnt != 1) ? 's' : ''));
$methods .= "\n";
push(@result, "$info$methods");
}
# Initialize the counter and store the adapter class identifier
# in the $info.
#
$info = $adapter_class;
$cnt = 0;
$methods = '';
}
else
{
# The line contains the prototype of the implemented method.
# If it is the required method, count it, and add it to the
# string of methods.
#
my $stripped_prototype = StripArgIdentifiers($line);
if (defined $$reqref{$stripped_prototype})
{
++$cnt;
$methods .= " $line\n";
}
}
}
# If the $info is not empty then it contains partial
# information about the last processed adapter.
#
if ($info ne '')
{
# Complete the $info and push it into the @result.
#
$info .= sprintf("\timplements %2d required method%s...\n",
$cnt, (($cnt != 1) ? 's' : ''));
$methods .= "\n";
push(@result, "$info$methods");
}
# Return the result list.
#
# push @result, $cont; # ???
return @result;
}
##}}}
################################################################ ################################################################
# GenerateLanguageDoc takes document templates and code sources # GenerateLanguageDoc takes document templates and code sources
# generates the content as expected in the $flangdoc file (the # generates the content as expected in the $flangdoc file (the
...@@ -684,6 +842,7 @@ xxxTABLE_FOOTxxx ...@@ -684,6 +842,7 @@ xxxTABLE_FOOTxxx
} }
##}}} ##}}}
################################################################ ################################################################
# CopyTemplateToLanguageDoc takes the $flangtpl template and # CopyTemplateToLanguageDoc takes the $flangtpl template and
# generates $flangdoc without using information from other # generates $flangdoc without using information from other
...@@ -816,7 +975,8 @@ print STDERR "\n\n"; ...@@ -816,7 +975,8 @@ print STDERR "\n\n";
closedir DIR; # ignore names with dot at the beginning closedir DIR; # ignore names with dot at the beginning
my @files = sort my @files = sort
grep { -f "$srcdir/$_" && m{^translator_..\.h$}i } grep { ! m{^translator_adapter\.h$}i }
grep { -f "$srcdir/$_" && m{^translator_\w+\.h$}i }
@entries; @entries;
##}}} ##}}}
...@@ -832,13 +992,15 @@ print STDERR "\n\n"; ...@@ -832,13 +992,15 @@ print STDERR "\n\n";
# #
my $output = ''; my $output = '';
my %details = (); my %details = ();
# Initialize the list of the required methods.
#
my %required = ();
# Remove the argument identifiers from the method prototypes # Remove the argument identifiers from the method prototypes
# to get only the required form of the prototype. Fill the # to get only the required form of the prototype. Fill the
# hash with them. #{{{ # hash with them. #{{{
# #
my %required = ();
foreach (@expected) { foreach (@expected) {
my $prototype = StripArgIdentifiers($_); my $prototype = StripArgIdentifiers($_);
$required{$prototype} = 1; $required{$prototype} = 1;
...@@ -1110,17 +1272,34 @@ print STDERR "\n\n"; ...@@ -1110,17 +1272,34 @@ print STDERR "\n\n";
} }
##}}} ##}}}
# List all the translator adapter classes to show for which versions
# the adapters had to be created. Show, how many and what new methods
# are implemented by the adapters. #{{{
#
print FOUT "\n" .'-' x 70 . "\n";
print FOUT <<'xxxENDxxx';
The following translator adapter classes are implemented -- the older (with
lower number) are always derived from the newer. They implement the
listed required methods. Notice that some versions of doxygen did not
introduce any changes related to the language translators. From here you may
guess how much work should be done to update your translator:
xxxENDxxx
my @adapter_info = GetAdapterClassesInfo(\%required);
foreach (@adapter_info) { print FOUT " $_"; }
##}}}
# List the methods that are expected to be implemented. #{{{ # List the methods that are expected to be implemented. #{{{
# #
print FOUT "\n\n" .'-' x 70 . "\n"; print FOUT "\n" .'-' x 70 . "\n";
print FOUT "Localized translators are expected to implement " print FOUT "Localized translators are expected to implement "
. "the following methods\n" . "the following methods\n"
. "(prototypes sorted aplhabetically):\n\n"; . "(prototypes sorted aplhabetically):\n\n";
foreach (sort @expected) { foreach (sort @expected) { print FOUT "$_\n"; }
print FOUT "$_\n";
}
##}}} ##}}}
# If there are some details for the translators, show them. #{{{ # If there are some details for the translators, show them. #{{{
......
Summary: A documentation system for C/C++.
Name: doxygen Name: doxygen
Version: 1.2.13.1 Version: 1.2.13_20020121
Summary: documentation system for C, C++ and IDL Release: 1
Release: 4 Epoch: 1
Source: doxygen-%{version}.src.tar.gz Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
Patch: doxygen-1.2.7-redhat.patch
Patch1: doxygen-1.2.12-qt2.patch
Group: Development/Tools
License: GPL
Url: http://www.stack.nl/~dimitri/doxygen/index.html
Prefix: %{_prefix}
BuildPrereq: libstdc++-devel >= 2.96, /usr/bin/perl
BuildRoot: %{_tmppath}/%{name}-%{version}-root
Copyright: GPL %description
Group: unsorted Doxygen can generate an online class browser (in HTML) and/or a
URL: http://www.stack.nl/~dimitri/doxygen reference manual (in LaTeX) from a set of documented source files. The
Packager: Matthias Andree <ma@dt.e-technik.uni-dortmund.de> documentation is extracted directly from the sources. Doxygen can
BuildRoot: /var/tmp/doxygen-%{version}.root also be configured to extract the code structure from undocumented
source files.
# requires Perl for tmake (Troll's make) %package doxywizard
BuildPrereq: perl tetex Summary: A GUI for creating and editing configuration files.
Group: User Interface/X
Requires: %{name} = %{version}
BuildPrereq: qt-devel => 2.3.0
Requires: qt >= 2.3.0
%description %description doxywizard
Doxygen is a documentation system for C and C++. It can generate an Doxywizard is a GUI for creating and editing configuration files that
on-line class browser (in HTML) and/or an off-line reference manual are used by doxygen.
(in LaTeX) from a set of documented source files. The documentation is
extracted directly from the sources. Doxygen is developed on a Linux
platform, but it runs on most other UNIX flavors as well. An
executable for Windows 95/NT is also available.
Author:
--------
Dimitri van Heesch <dimitri@stack.nl>
%description -l de
Doxygen ist ein Dokumentationssystem fr C und C++. Es kann eine
Klassenbersicht (in HTML) und/oder eine Referenz (in LaTeX) aus
dokumentierten Quelldateien erzeugen. Die Dokumentation wird direkt aus
den Quellen extrahiert. Doxygen wird auf einer Linux-Plattform
entwickelt, funktioniert aber genauso auf den meisten andern Unix
Dialekten. Das Programm ist auch fr Windows 95/NT erhltlich.
Autor:
--------
Dimitri van Heesch <dimitri@stack.nl>
%prep %prep
%setup -n doxygen-%{version} %setup -q
%patch -p1 -b .redhat
%patch1 -p1 -b .qt2
%build %build
CFLAGS="$RPM_OPT_FLAGS" ./configure --with-doxywizard QTDIR="" && . /etc/profile.d/qt.sh
# the next path is Suse specific export OLD_PO_FILE_INPUT=yes
QTDIR=/usr/lib/qt2
PATH=${QTDIR}/bin:$PATH ./configure --prefix %{_prefix} --shared --release --with-doxywizard
export QTDIR PATH make all docs
make
%install %install
rm -rf $RPM_BUILD_ROOT rm -rf ${RPM_BUILD_ROOT}
make install install_docs INSTALL=$RPM_BUILD_ROOT/usr \
DOCDIR=$RPM_BUILD_ROOT%{_docdir}/doxygen export OLD_PO_FILE_INPUT=yes
install -m 644 LICENSE LANGUAGE.HOWTO PLATFORMS README VERSION \ make install INSTALL=$RPM_BUILD_ROOT%{_prefix}
$RPM_BUILD_ROOT%{_docdir}/doxygen
find $RPM_BUILD_ROOT -name CVS -type d -depth -exec rm -r {} \; %clean
rm -rf ${RPM_BUILD_ROOT}
%files %files
%defattr(-,root,root) %defattr(-,root,root)
%attr(755,root,root) /usr/bin/* %doc LANGUAGE.HOWTO README examples html
%doc %{_docdir}/doxygen %{_bindir}/doxygen
%{_bindir}/doxysearch
%{_bindir}/doxytag
%clean %files doxywizard
rm -rf $RPM_BUILD_ROOT %defattr(-,root,root)
%{_bindir}/doxywizard
%changelog %changelog
* Sun Jun 10 2001 Matthias Andree <ma@dt.e-technik.uni-dortmund.de> * Sun Jan 06 2002 Than Ngo <than@redhat.com> 1.2.13.1-1
- update to 1.2.8.1 - update to 1.2.13.1
* Tue Jun 5 2001 Matthias Andree <ma@dt.e-technik.uni-dortmund.de>
- update to 1.2.8 * Sun Dec 30 2001 Jeff Johnson <jbj@redhat.com> 1.2.13-1
- enable XML-Generator - update to 1.2.13
* Mon Apr 16 2001 Jens Seidel <jensseidel@users.sourceforge.net>
- new decription (english, german) * Sun Nov 18 2001 Than Ngo <than@redhat.com> 1.2.12-1
- use of %{_docdir} - update to 1.2.12
- added README, LICENSE, ... to install section - s/Copyright/License
* Mon Mar 13 2000 Matthias Andree <ma@dt.e-technik.uni-dortmund.de>
- inital version build with rpmify * Wed Sep 12 2001 Tim Powers <timp@redhat.com>
- rebuild with new gcc and binutils
* Wed Jun 13 2001 Than Ngo <than@redhat.com>
- update tp 1.2.8.1
- make doxywizard as separat package
- fix to use install as default
* Tue Jun 05 2001 Than Ngo <than@redhat.com>
- update to 1.2.8
* Tue May 01 2001 Than Ngo <than@redhat.com>
- update to 1.2.7
- clean up specfile
- patch to use RPM_OPT_FLAG
* Wed Mar 14 2001 Jeff Johnson <jbj@redhat.com>
- update to 1.2.6
* Wed Feb 28 2001 Trond Eivind Glomsrd <teg@redhat.com>
- rebuild
* Tue Dec 26 2000 Than Ngo <than@redhat.com>
- update to 1.2.4
- remove excludearch ia64
- bzip2 sources
* Mon Dec 11 2000 Than Ngo <than@redhat.com>
- rebuild with the fixed fileutils
* Mon Oct 30 2000 Jeff Johnson <jbj@redhat.com>
- update to 1.2.3.
* Sun Oct 8 2000 Jeff Johnson <jbj@redhat.com>
- update to 1.2.2.
- enable doxywizard.
* Sat Aug 19 2000 Preston Brown <pbrown@redhat.com>
- 1.2.1 is latest stable, so we upgrade before Winston is released.
* Wed Jul 12 2000 Prospector <bugzilla@redhat.com>
- automatic rebuild
* Tue Jul 4 2000 Jakub Jelinek <jakub@redhat.com>
- Rebuild with new C++
* Fri Jun 30 2000 Florian La Roche <laroche@redhat.de>
- fix QTDIR detection
* Fri Jun 09 2000 Preston Brown <pbrown@redhat.com>
- compile on x86 w/o optimization, revert when compiler fixed!!
* Wed Jun 07 2000 Preston Brown <pbrown@redhat.com>
- use newer RPM macros
* Tue Jun 6 2000 Jeff Johnson <jbj@redhat.com>
- add to distro.
* Tue May 9 2000 Tim Powers <timp@redhat.com>
- rebuilt for 7.0
* Wed Feb 2 2000 Bernhard Rosenkraenzer <bero@redhat.com>
- recompile with current Qt (2.1.0/1.45)
* Wed Jan 5 2000 Jeff Johnson <jbj@redhat.com>
- update to 1.0.0.
- recompile with qt-2.0.1 if available.
- relocatable package.
* Mon Nov 8 1999 Tim Powers <timp@redhat.com>
-updated to 0.49-991106
* Tue Jul 13 1999 Tim Powers <timp@redhat.com>
- updated source
- cleaned up some stuff in the spec file
* Thu Apr 22 1999 Jeff Johnson <jbj@redhat.com>
- Create Power Tools 6.0 package.
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
# #
# #
# #
# Copyright (C) 1997-2001 by Dimitri van Heesch. # Copyright (C) 1997-2002 by Dimitri van Heesch.
# #
# Permission to use, copy, modify, and distribute this software and its # Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby # documentation under the terms of the GNU General Public License is hereby
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -179,6 +179,18 @@ void ClassDef::addMembersToMemberGroup() ...@@ -179,6 +179,18 @@ void ClassDef::addMembersToMemberGroup()
::addMembersToMemberGroup(&friends,memberGroupSDict,this); ::addMembersToMemberGroup(&friends,memberGroupSDict,this);
::addMembersToMemberGroup(&related,memberGroupSDict,this); ::addMembersToMemberGroup(&related,memberGroupSDict,this);
::addMembersToMemberGroup(&properties,memberGroupSDict,this); ::addMembersToMemberGroup(&properties,memberGroupSDict,this);
// add members inside sections to their groups
MemberGroupSDict::Iterator mgli(*memberGroupSDict);
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
if (mg->allMembersInSameSection() && m_subGrouping)
{
//printf("addToDeclarationSection(%s)\n",mg->header().data());
mg->addToDeclarationSection();
}
}
} }
// adds new member definition to the class // adds new member definition to the class
...@@ -722,7 +734,7 @@ void ClassDef::writeDocumentation(OutputList &ol) ...@@ -722,7 +734,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
} }
ol.writeSynopsis(); ol.writeSynopsis();
if (m_incInfo) if (m_incInfo && Config_getBool("SHOW_INCLUDE_FILES"))
{ {
QCString nm=m_incInfo->includeName.isEmpty() ? QCString nm=m_incInfo->includeName.isEmpty() ?
(m_incInfo->fileDef ? (m_incInfo->fileDef ?
...@@ -992,7 +1004,7 @@ void ClassDef::writeDocumentation(OutputList &ol) ...@@ -992,7 +1004,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
else // add this group to the corresponding member section else // add this group to the corresponding member section
{ {
//printf("addToDeclarationSection(%s)\n",mg->header().data()); //printf("addToDeclarationSection(%s)\n",mg->header().data());
mg->addToDeclarationSection(); //mg->addToDeclarationSection();
} }
} }
...@@ -1299,8 +1311,10 @@ void ClassDef::writeMemberList(OutputList &ol) ...@@ -1299,8 +1311,10 @@ void ClassDef::writeMemberList(OutputList &ol)
ol.writeString("</td>"); ol.writeString("</td>");
memberWritten=TRUE; memberWritten=TRUE;
} }
else if (!Config_getBool("HIDE_UNDOC_MEMBERS")) // no documentation, else if (!Config_getBool("HIDE_UNDOC_MEMBERS") &&
// generate link to the class instead. (md->protection()!=Private || Config_getBool("EXTRACT_PRIVATE") || md->isFriend())
) // no documentation,
// generate link to the class instead.
{ {
//ol.writeListItem(); //ol.writeListItem();
ol.writeString(" <tr bgcolor=\"#f0f0f0\"><td>"); ol.writeString(" <tr bgcolor=\"#f0f0f0\"><td>");
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -646,11 +646,15 @@ static void generateClassOrGlobalLink(OutputDocInterface &ol,char *clName,int *c ...@@ -646,11 +646,15 @@ static void generateClassOrGlobalLink(OutputDocInterface &ol,char *clName,int *c
writeMultiLineCodeLink(ol,d->getReference(),d->getOutputFileBase(),md->getBodyAnchor(),clName); writeMultiLineCodeLink(ol,d->getReference(),d->getOutputFileBase(),md->getBodyAnchor(),clName);
if (g_currentMemberDef) if (g_currentMemberDef)
{ {
if (Config_getBool("REFERENCED_BY_RELATION") && g_currentMemberDef->isFunction()) if (Config_getBool("REFERENCED_BY_RELATION") &&
(g_currentMemberDef->isFunction() || g_currentMemberDef->isSlot())
)
{ {
md->addSourceReferencedBy(g_currentMemberDef); md->addSourceReferencedBy(g_currentMemberDef);
} }
if (Config_getBool("REFERENCES_RELATION") && g_currentMemberDef->isFunction()) if (Config_getBool("REFERENCES_RELATION") &&
(g_currentMemberDef->isFunction() || g_currentMemberDef->isSlot())
)
{ {
g_currentMemberDef->addSourceReferences(md); g_currentMemberDef->addSourceReferences(md);
} }
...@@ -710,11 +714,15 @@ static bool getLink(const char *className, ...@@ -710,11 +714,15 @@ static bool getLink(const char *className,
if (g_currentDefinition && g_currentMemberDef && if (g_currentDefinition && g_currentMemberDef &&
md!=g_currentMemberDef && g_insideBody) md!=g_currentMemberDef && g_insideBody)
{ {
if (Config_getBool("REFERENCED_BY_RELATION") && g_currentMemberDef->isFunction()) if (Config_getBool("REFERENCED_BY_RELATION") &&
(g_currentMemberDef->isFunction() || g_currentMemberDef->isSlot())
)
{ {
md->addSourceReferencedBy(g_currentMemberDef); md->addSourceReferencedBy(g_currentMemberDef);
} }
if (Config_getBool("REFERENCES_RELATION") && g_currentMemberDef->isFunction()) if (Config_getBool("REFERENCES_RELATION") &&
(g_currentMemberDef->isFunction() || g_currentMemberDef->isSlot())
)
{ {
g_currentMemberDef->addSourceReferences(md); g_currentMemberDef->addSourceReferences(md);
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
#include <qstack.h> #include <qstack.h>
#include "config.h" #include "config.h"
#include "lang_cfg.h"
#include "version.h" #include "version.h"
#undef Config_getString #undef Config_getString
...@@ -1045,6 +1044,7 @@ void Config::check() ...@@ -1045,6 +1044,7 @@ void Config::check()
filePatternList.append("*.hpp"); filePatternList.append("*.hpp");
filePatternList.append("*.h++"); filePatternList.append("*.h++");
filePatternList.append("*.idl"); filePatternList.append("*.idl");
filePatternList.append("*.odl");
} }
// add default pattern if needed // add default pattern if needed
...@@ -1602,8 +1602,8 @@ void Config::create() ...@@ -1602,8 +1602,8 @@ void Config::create()
"FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n" "FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n"
"and *.h) to filter out the source-files in the directories. If left \n" "and *.h) to filter out the source-files in the directories. If left \n"
"blank the following patterns are tested: \n" "blank the following patterns are tested: \n"
"*.c *.cc *.cxx *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp \n" "*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp \n"
"*.h++ *.idl \n" "*.h++ *.idl *.odl\n"
); );
cb = addBool( cb = addBool(
"RECURSIVE", "RECURSIVE",
...@@ -1618,6 +1618,12 @@ void Config::create() ...@@ -1618,6 +1618,12 @@ void Config::create()
"excluded from the INPUT source files. This way you can easily exclude a \n" "excluded from the INPUT source files. This way you can easily exclude a \n"
"subdirectory from a directory tree whose root is specified with the INPUT tag. \n" "subdirectory from a directory tree whose root is specified with the INPUT tag. \n"
); );
cb = addBool(
"EXCLUDE_SYMLINKS",
"The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories \n"
"that are symbolic links (a Unix filesystem feature) are excluded from the input. \n",
FALSE
);
cl->setWidgetType(ConfigList::FileAndDir); cl->setWidgetType(ConfigList::FileAndDir);
cl = addList( cl = addList(
"EXCLUDE_PATTERNS", "EXCLUDE_PATTERNS",
...@@ -2134,6 +2140,13 @@ void Config::create() ...@@ -2134,6 +2140,13 @@ void Config::create()
"will be listed. \n", "will be listed. \n",
FALSE FALSE
); );
cb = addBool(
"EXTERNAL_GROUPS",
"If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed \n"
"in the modules index. If set to NO, only the current project's groups will \n"
"be listed. \n",
TRUE
);
cs = addString( cs = addString(
"PERL_PATH", "PERL_PATH",
"The PERL_PATH should be the absolute path and name of the perl script \n" "The PERL_PATH should be the absolute path and name of the perl script \n"
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -416,7 +416,7 @@ void Definition::writeSourceRefList(OutputList &ol,const char *scopeName, ...@@ -416,7 +416,7 @@ void Definition::writeSourceRefList(OutputList &ol,const char *scopeName,
{ {
ol.docify(name); ol.docify(name);
} }
if (md->isFunction()) ol.docify("()"); if (md->isFunction() && md->isSlot()) ol.docify("()");
} }
index=newIndex+matchLen; index=newIndex+matchLen;
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -5221,6 +5221,7 @@ static void buildPageList(Entry *root) ...@@ -5221,6 +5221,7 @@ static void buildPageList(Entry *root)
{ {
if (root->section == Entry::PAGEDOC_SEC) if (root->section == Entry::PAGEDOC_SEC)
{ {
//printf("buildPageList %s\n",root->name.data());
if (!root->name.isEmpty()) if (!root->name.isEmpty())
{ {
addRelatedPage(root); addRelatedPage(root);
...@@ -6038,6 +6039,7 @@ static int readDir(QFileInfo *fi, ...@@ -6038,6 +6039,7 @@ static int readDir(QFileInfo *fi,
err("Error: source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data()); err("Error: source %s is not a readable file or directory... skipping.\n",cfi->absFilePath().data());
} }
else if (cfi->isFile() && else if (cfi->isFile() &&
(!Config_getBool("EXCLUDE_SYMLINKS") || !cfi->isSymLink()) &&
(patList==0 || patternMatch(cfi,patList)) && (patList==0 || patternMatch(cfi,patList)) &&
!patternMatch(cfi,exclPatList)) !patternMatch(cfi,exclPatList))
{ {
...@@ -6069,6 +6071,7 @@ static int readDir(QFileInfo *fi, ...@@ -6069,6 +6071,7 @@ static int readDir(QFileInfo *fi,
if (resultDict) resultDict->insert(cfi->absFilePath(),rs); if (resultDict) resultDict->insert(cfi->absFilePath(),rs);
} }
else if (recursive && else if (recursive &&
(!Config_getBool("EXCLUDE_SYMLINKS") || !cfi->isSymLink()) &&
cfi->isDir() && cfi->fileName()!="." && cfi->isDir() && cfi->fileName()!="." &&
cfi->fileName()!="..") cfi->fileName()!="..")
{ {
...@@ -6150,40 +6153,45 @@ static int readFileOrDirectory(const char *s, ...@@ -6150,40 +6153,45 @@ static int readFileOrDirectory(const char *s,
{ {
err("Error: source %s is not a readable file or directory... skipping.\n",s); err("Error: source %s is not a readable file or directory... skipping.\n",s);
} }
else if (fi.isFile()) else if (!Config_getBool("EXCLUDE_SYMLINKS") || !fi.isSymLink())
{ {
totalSize+=fi.size()+fi.absFilePath().length()+4; //readFile(&fi,fiList,input); if (fi.isFile())
//fiList->inSort(new FileInfo(fi));
QCString name=convertToQCString(fi.fileName());
//printf("New file %s\n",name.data());
if (fnDict)
{ {
FileDef *fd=new FileDef(fi.dirPath(TRUE)+"/",name); totalSize+=fi.size()+fi.absFilePath().length()+4; //readFile(&fi,fiList,input);
FileName *fn=0; //fiList->inSort(new FileInfo(fi));
if (!name.isEmpty() && (fn=(*fnDict)[name])) QCString name=convertToQCString(fi.fileName());
//printf("New file %s\n",name.data());
if (fnDict)
{ {
fn->append(fd); FileDef *fd=new FileDef(fi.dirPath(TRUE)+"/",name);
FileName *fn=0;
if (!name.isEmpty() && (fn=(*fnDict)[name]))
{
fn->append(fd);
}
else
{
fn = new FileName(fi.absFilePath(),name);
fn->append(fd);
if (fnList) fnList->inSort(fn);
fnDict->insert(name,fn);
}
} }
else QCString *rs=0;
if (resultList || resultDict)
{ {
fn = new FileName(fi.absFilePath(),name); rs=new QCString(fi.absFilePath());
fn->append(fd);
if (fnList) fnList->inSort(fn);
fnDict->insert(name,fn);
} }
if (resultList) resultList->append(rs);
if (resultDict) resultDict->insert(fi.absFilePath(),rs);
} }
QCString *rs=0; else if (fi.isDir()) // readable dir
if (resultList || resultDict)
{ {
rs=new QCString(fi.absFilePath()); totalSize+=readDir(&fi,fnList,fnDict,exclDict,patList,
exclPatList,resultList,resultDict,errorIfNotExist,
recursive);
} }
if (resultList) resultList->append(rs);
if (resultDict) resultDict->insert(fi.absFilePath(),rs);
} }
else if (fi.isDir()) // readable dir
totalSize+=readDir(&fi,fnList,fnDict,exclDict,patList,
exclPatList,resultList,resultDict,errorIfNotExist,
recursive);
} }
} }
return totalSize; return totalSize;
...@@ -6226,7 +6234,7 @@ static void readFormulaRepository() ...@@ -6226,7 +6234,7 @@ static void readFormulaRepository()
static void usage(const char *name) static void usage(const char *name)
{ {
msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2001\n\n",versionString); msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2002\n\n",versionString);
msg("You can use doxygen in a number of ways:\n\n"); msg("You can use doxygen in a number of ways:\n\n");
msg("1) Use doxygen to generate a template configuration file:\n"); msg("1) Use doxygen to generate a template configuration file:\n");
msg(" %s [-s] -g [configName]\n\n",name); msg(" %s [-s] -g [configName]\n\n",name);
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
# #
# #
# #
# Copyright (C) 1997-2001 by Dimitri van Heesch. # Copyright (C) 1997-2002 by Dimitri van Heesch.
# #
# Permission to use, copy, modify, and distribute this software and its # Permission to use, copy, modify, and distribute this software and its
# documentation under the terms of the GNU General Public License is hereby # documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
...@@ -505,7 +505,7 @@ void parseFileOrDir(const char *fileName) ...@@ -505,7 +505,7 @@ void parseFileOrDir(const char *fileName)
void usage(const char *name) void usage(const char *name)
{ {
fprintf(stderr,"Doxytag version %s\nCopyright Dimitri van Heesch 1997-2001\n\n", fprintf(stderr,"Doxytag version %s\nCopyright Dimitri van Heesch 1997-2002\n\n",
versionString); versionString);
fprintf(stderr," Generates a tag file and/or a search index for a set of HTML files\n\n"); fprintf(stderr," Generates a tag file and/or a search index for a set of HTML files\n\n");
fprintf(stderr,"Usage: %s [-t tag_file] [-s index_file] [ html_file [html_file...] ]\n",name); fprintf(stderr,"Usage: %s [-t tag_file] [-s index_file] [ html_file [html_file...] ]\n",name);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
* *
* *
* *
* Copyright (C) 1997-2001 by Dimitri van Heesch. * Copyright (C) 1997-2002 by Dimitri van Heesch.
* *
* Permission to use, copy, modify, and distribute this software and its * Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby * documentation under the terms of the GNU General Public License is hereby
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment