Commit 0df9adf5 authored by dimitri's avatar dimitri

Doxygen-1.2.13-20020122

parent a66e1ada
......@@ -95,7 +95,7 @@ IGNORE_PREFIX =
#---------------------------------------------------------------------------
# configuration options related to the HTML output
#---------------------------------------------------------------------------
GENERATE_HTML = YES
GENERATE_HTML = NO
HTML_OUTPUT =
HTML_HEADER =
HTML_FOOTER =
......@@ -168,7 +168,7 @@ PERL_PATH = /usr/bin/perl
# Configuration options related to the dot tool
#---------------------------------------------------------------------------
CLASS_DIAGRAMS = NO
HAVE_DOT = YES
HAVE_DOT = NO
CLASS_GRAPH = YES
COLLABORATION_GRAPH = 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.
--------
Dimitri van Heesch (05 January 2002)
Dimitri van Heesch (21 January 2002)
......@@ -10,6 +10,7 @@ clean: FORCE
cd addon/doxywizard ; $(MAKE) clean
cd addon/doxmlparser/src ; $(MAKE) clean
cd addon/doxmlparser/test ; $(MAKE) clean
cd addon/doxmlparser/examples/metrics ; $(MAKE) clean
-rm -f bin/doxy*
-rm -f objects/*.o
......@@ -18,6 +19,7 @@ distclean: clean
cd addon/doxywizard ; $(MAKE) distclean
cd addon/doxmlparser/src ; $(MAKE) distclean
cd addon/doxmlparser/test ; $(MAKE) distclean
cd addon/doxmlparser/examples/metrics ; $(MAKE) distclean
-rm -f lib/lib*
-rm -f bin/doxy*
-rm -f html
......
DOXYGEN Version 1.2.13.1
DOXYGEN Version 1.2.13_20020121
Please read INSTALL for compilation instructions.
......@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (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
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
QUIET = YES
QUIET = NO
WARNINGS = YES
WARN_IF_UNDOCUMENTED = YES
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 @@
class IMember;
class IDocIterator;
class ICompound;
class ISection;
class ILinkedText
{
public:
enum Kind { Kind_Text, Kind_Ref };
virtual Kind kind() const = 0;
virtual ~ILinkedText() {}
};
class ILT_Text : public ILinkedText
......@@ -49,6 +52,7 @@ class IParam
virtual QString attrib() const = 0;
virtual QString arraySpecifier() const = 0;
virtual ILinkedTextIterator *defaultValue() const = 0;
virtual ~IParam() {}
};
class IParamIterator
......@@ -67,6 +71,7 @@ class IMemberReference
public:
virtual IMember *member() const = 0;
virtual QString memberName() const = 0;
virtual ~IMemberReference() {}
};
class IMemberReferenceIterator
......@@ -85,6 +90,7 @@ class IEnumValue
public:
virtual QString name() const = 0;
virtual QString initializer() const = 0;
virtual ~IEnumValue() {}
};
class IEnumValueIterator
......@@ -136,6 +142,7 @@ class IDoc
Root // 30 -> IDocRoot
};
virtual Kind kind() const = 0;
virtual ~IDoc() {}
};
class IDocMarkup : public IDoc
......@@ -234,7 +241,7 @@ class IDocRef : public IDoc
{
public:
enum TargetKind { Member, Compound };
virtual QString id() const = 0;
virtual QString refId() const = 0;
virtual TargetKind targetKind() const = 0;
virtual QString external() const = 0;
virtual QString text() const = 0;
......@@ -340,11 +347,19 @@ class IDocIterator
class IMember
{
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 protection() const = 0;
virtual QString virtualness() const = 0;
virtual ILinkedTextIterator *type() const = 0;
virtual QString typeString() const = 0;
virtual QString name() const = 0;
virtual bool isConst() const = 0;
virtual bool isVolatile() const = 0;
......@@ -362,6 +377,7 @@ class IMember
virtual IEnumValueIterator *enumValues() const = 0;
virtual IDocRoot *briefDescription() const = 0;
virtual IDocRoot *detailedDescription() const = 0;
virtual ~IMember() {}
};
class IMemberIterator
......@@ -378,8 +394,26 @@ class IMemberIterator
class ISection
{
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 bool isStatic() const = 0;
virtual bool isPublic() const = 0;
virtual bool isPrivate() const = 0;
virtual bool isProtected() const = 0;
virtual ~ISection() {}
};
class ISectionIterator
......@@ -396,21 +430,42 @@ class ISectionIterator
class ICompound
{
public:
enum CompoundKind { Invalid=0,
Class, Struct, Union, Interface, Exception,
Namespace, File, Group, Page, Package
};
virtual QString name() 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 IDocRoot *briefDescription() 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
{
public:
virtual ICompound *toFirst() = 0;
virtual ICompound *toLast() = 0;
virtual ICompound *toNext() = 0;
virtual ICompound *toPrev() = 0;
virtual void toFirst() = 0;
virtual void toLast() = 0;
virtual void toNext() = 0;
virtual void toPrev() = 0;
virtual ICompound *current() const = 0;
virtual void release() = 0;
};
......@@ -419,6 +474,7 @@ class ICompoundIterator
class IDoxygen
{
public:
/*! Returns an iterator that can be used to iterate over the list
* of compounds found in the project.
*/
......@@ -435,28 +491,43 @@ class IDoxygen
*/
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.
*/
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.
*/
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
* createdObjecModelFromXML(). First release all iterators before calling
* this function.
*/
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
* by doxygen.
* @param xmlFileName The name of the XML to parse.
* @returns An iterface to the object model.
/*! Factory method that creates an empty object model for a doxygen generated XML file.
* Use the readXMLDir() method to build the model from an XML output
* directory containing doxygen output.
*/
IDoxygen *createObjectModelFromXML(const char *xmlFileName);
IDoxygen *createObjectModel();
#endif
......@@ -3,7 +3,7 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......@@ -20,11 +20,14 @@
#include <qdict.h>
#include <qstring.h>
#include "debug.h"
class IBaseHandler
{
public:
virtual void setDelegate(QXmlDefaultHandler *delegate) = 0;
virtual QXmlDefaultHandler *delegate() const = 0;
virtual ~IBaseHandler() {}
};
class IFallBackHandler
......@@ -33,6 +36,7 @@ class IFallBackHandler
virtual bool handleStartElement(const QString & name,
const QXmlAttributes & attrib) = 0;
virtual bool handleEndElement(const QString &name) = 0;
virtual ~IFallBackHandler() {}
};
template<class T> class ElementMapper
......@@ -104,9 +108,15 @@ template<class T> class ElementMapper
QDict<EndElementHandlerT> m_endHandlers;
};
template<class T> class BaseHandler : public IBaseHandler,
public QXmlDefaultHandler,
public ElementMapper<T>
struct LocatorContainer
{
static QXmlLocator *s_theLocator;
};
template<class T> class BaseHandler : public QXmlDefaultHandler,
public ElementMapper<T>,
public LocatorContainer,
public IBaseHandler
{
public:
BaseHandler() : m_delegateHandler(0), m_fallBackHandler(0)
......@@ -136,7 +146,9 @@ template<class T> class BaseHandler : public IBaseHandler,
if (!m_skipUntil.isEmpty()) // skip mode
{
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;
}
......@@ -150,7 +162,9 @@ template<class T> class BaseHandler : public IBaseHandler,
!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_skipCount=1;
}
......@@ -167,7 +181,9 @@ template<class T> class BaseHandler : public IBaseHandler,
if (name==m_skipUntil)
{
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)
{
m_skipUntil="";
......@@ -198,7 +214,9 @@ template<class T> class BaseHandler : public IBaseHandler,
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;
}
......@@ -237,6 +255,12 @@ template<class T> class BaseHandler : public IBaseHandler,
return m_fallBackHandler;
}
void setDocumentLocator( QXmlLocator * locator )
{
debug(2,"setDocumentLocator(%p)\n",locator);
s_theLocator = locator;
}
protected:
QString m_curString;
QString m_skipUntil;
......
......@@ -3,7 +3,7 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -3,7 +3,7 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......@@ -16,14 +16,97 @@
#include "mainhandler.h"
#include "compoundhandler.h"
#include "dochandler.h"
#include "debug.h"
CompoundHandler::CompoundHandler(IBaseHandler *parent)
: m_parent(parent), m_brief(0), m_detailed(0), m_programListing(0)
class CompoundErrorHandler : public QXmlErrorHandler
{
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_subClasses.setAutoDelete(TRUE);
m_sections.setAutoDelete(TRUE);
m_memberNameDict.setAutoDelete(TRUE);
addStartHandler("doxygen");
addEndHandler("doxygen");
addStartHandler("compounddef",this,&CompoundHandler::startCompound);
addEndHandler("compounddef",this,&CompoundHandler::endCompound);
addStartHandler("compoundname");
......@@ -45,10 +128,12 @@ CompoundHandler::CompoundHandler(IBaseHandler *parent)
addEndHandler("location");
addStartHandler("programlisting",this,&CompoundHandler::startProgramListing);
}
CompoundHandler::~CompoundHandler()
{
debug(2,"CompoundHandler::~CompoundHandler()\n");
delete m_brief;
delete m_detailed;
delete m_programListing;
......@@ -84,28 +169,27 @@ void CompoundHandler::startProgramListing(const QXmlAttributes& attrib)
void CompoundHandler::startCompound(const QXmlAttributes& attrib)
{
m_parent->setDelegate(this);
m_id = attrib.value("id");
m_kind = attrib.value("kind");
printf("startCompound(id=`%s' type=`%s')\n",m_id.data(),m_kind.data());
m_kindString = attrib.value("kind");
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");
m_defLine = attrib.value("line").toInt();
debug(2,"endCompound()\n");
}
void CompoundHandler::endCompound()
void CompoundHandler::startLocation(const QXmlAttributes& attrib)
{
printf("endCompound()\n");
m_parent->setDelegate(0);
m_defFile = attrib.value("file");
m_defLine = attrib.value("line").toInt();
}
void CompoundHandler::endCompoundName()
{
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)
......@@ -115,7 +199,7 @@ void CompoundHandler::addSuperClass(const QXmlAttributes& attrib)
attrib.value("prot"),
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_protection.data(),
sc->m_virtualness.data());
......@@ -129,20 +213,56 @@ void CompoundHandler::addSubClass(const QXmlAttributes& attrib)
attrib.value("prot"),
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_protection.data(),
sc->m_virtualness.data());
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);
SectionHandler *sec;
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 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......@@ -28,13 +28,6 @@ class MainHandler;
class DocHandler;
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>
{
public:
......@@ -48,22 +41,34 @@ class CompoundHandler : public ICompound, public BaseHandler<CompoundHandler>
virtual void startDetailedDesc(const QXmlAttributes& attrib);
virtual void startLocation(const QXmlAttributes& attrib);
virtual void startProgramListing(const QXmlAttributes& attrib);
virtual void addref() { m_refCount++; }
CompoundHandler(IBaseHandler *parent);
CompoundHandler(const QString &dirName);
virtual ~CompoundHandler();
void initialize(MainHandler *m);
bool parseXML(const QString &compId);
void initialize(MainHandler *mh);
void insertMember(MemberHandler *mh);
// ICompound implementation
QString name() const { return m_name; }
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
{ return new SectionIterator(m_sections); }
virtual IDocRoot *briefDescription() const
{ return m_brief; }
virtual IDocRoot *detailedDescription() const
{ 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:
struct SuperClass
......@@ -87,15 +92,23 @@ class CompoundHandler : public ICompound, public BaseHandler<CompoundHandler>
QList<SuperClass> m_superClasses;
QList<SubClass> m_subClasses;
QList<ISection> m_sections;
IBaseHandler *m_parent;
DocHandler *m_brief;
DocHandler *m_detailed;
ProgramListingHandler *m_programListing;
QString m_id;
QString m_kind;
QString m_kindString;
CompoundKind m_kind;
QString m_name;
QString m_defFile;
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
#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 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......@@ -449,11 +449,16 @@ class RefHandler : public IDocRef, public BaseHandler<RefHandler>
// IDocRef
virtual Kind kind() const { return Ref; }
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:
IBaseHandler *m_parent;
QString m_refId;
QString m_extId;
QString m_linkText;
TargetKind m_targetKind;
};
//-----------------------------------------------------------------------------
......@@ -582,7 +587,7 @@ class VariableListHandler : public IDocVariableList, public BaseHandler<Variable
/*! \brief Node representing a highlighted text fragment.
*
*/
// children: -
// TODO: children: ref
class HighlightHandler : public IDocHighlight, public BaseHandler<HighlightHandler>
{
public:
......@@ -590,14 +595,17 @@ class HighlightHandler : public IDocHighlight, public BaseHandler<HighlightHandl
virtual ~HighlightHandler();
void startHighlight(const QXmlAttributes& attrib);
void endHighlight();
virtual void startRef(const QXmlAttributes&);
// IDocHighlight
virtual Kind kind() const { return Highlight; }
private:
void addTextNode();
IBaseHandler *m_parent;
QString m_class;
QString m_text;
QList<IDoc> m_children;
};
//-----------------------------------------------------------------------------
......@@ -915,4 +923,7 @@ class DocIterator : public BaseIterator<IDocIterator,IDoc,IDoc>
BaseIterator<IDocIterator,IDoc,IDoc>(handler.m_children) {}
};
void dochandler_init();
void dochandler_exit();
#endif
......@@ -5,12 +5,15 @@
class IMember;
class IDocIterator;
class ICompound;
class ISection;
class ILinkedText
{
public:
enum Kind { Kind_Text, Kind_Ref };
virtual Kind kind() const = 0;
virtual ~ILinkedText() {}
};
class ILT_Text : public ILinkedText
......@@ -49,6 +52,7 @@ class IParam
virtual QString attrib() const = 0;
virtual QString arraySpecifier() const = 0;
virtual ILinkedTextIterator *defaultValue() const = 0;
virtual ~IParam() {}
};
class IParamIterator
......@@ -67,6 +71,7 @@ class IMemberReference
public:
virtual IMember *member() const = 0;
virtual QString memberName() const = 0;
virtual ~IMemberReference() {}
};
class IMemberReferenceIterator
......@@ -85,6 +90,7 @@ class IEnumValue
public:
virtual QString name() const = 0;
virtual QString initializer() const = 0;
virtual ~IEnumValue() {}
};
class IEnumValueIterator
......@@ -136,6 +142,7 @@ class IDoc
Root // 30 -> IDocRoot
};
virtual Kind kind() const = 0;
virtual ~IDoc() {}
};
class IDocMarkup : public IDoc
......@@ -234,7 +241,7 @@ class IDocRef : public IDoc
{
public:
enum TargetKind { Member, Compound };
virtual QString id() const = 0;
virtual QString refId() const = 0;
virtual TargetKind targetKind() const = 0;
virtual QString external() const = 0;
virtual QString text() const = 0;
......@@ -340,11 +347,19 @@ class IDocIterator
class IMember
{
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 protection() const = 0;
virtual QString virtualness() const = 0;
virtual ILinkedTextIterator *type() const = 0;
virtual QString typeString() const = 0;
virtual QString name() const = 0;
virtual bool isConst() const = 0;
virtual bool isVolatile() const = 0;
......@@ -362,6 +377,7 @@ class IMember
virtual IEnumValueIterator *enumValues() const = 0;
virtual IDocRoot *briefDescription() const = 0;
virtual IDocRoot *detailedDescription() const = 0;
virtual ~IMember() {}
};
class IMemberIterator
......@@ -378,8 +394,26 @@ class IMemberIterator
class ISection
{
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 bool isStatic() const = 0;
virtual bool isPublic() const = 0;
virtual bool isPrivate() const = 0;
virtual bool isProtected() const = 0;
virtual ~ISection() {}
};
class ISectionIterator
......@@ -396,21 +430,42 @@ class ISectionIterator
class ICompound
{
public:
enum CompoundKind { Invalid=0,
Class, Struct, Union, Interface, Exception,
Namespace, File, Group, Page, Package
};
virtual QString name() 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 IDocRoot *briefDescription() 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
{
public:
virtual ICompound *toFirst() = 0;
virtual ICompound *toLast() = 0;
virtual ICompound *toNext() = 0;
virtual ICompound *toPrev() = 0;
virtual void toFirst() = 0;
virtual void toLast() = 0;
virtual void toNext() = 0;
virtual void toPrev() = 0;
virtual ICompound *current() const = 0;
virtual void release() = 0;
};
......@@ -419,6 +474,7 @@ class ICompoundIterator
class IDoxygen
{
public:
/*! Returns an iterator that can be used to iterate over the list
* of compounds found in the project.
*/
......@@ -435,28 +491,43 @@ class IDoxygen
*/
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.
*/
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.
*/
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
* createdObjecModelFromXML(). First release all iterators before calling
* this function.
*/
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
* by doxygen.
* @param xmlFileName The name of the XML to parse.
* @returns An iterface to the object model.
/*! Factory method that creates an empty object model for a doxygen generated XML file.
* Use the readXMLDir() method to build the model from an XML output
* directory containing doxygen output.
*/
IDoxygen *createObjectModelFromXML(const char *xmlFileName);
IDoxygen *createObjectModel();
#endif
......@@ -3,11 +3,13 @@ CONFIG = console staticlib warn_on $extraopts
HEADERS = basehandler.h mainhandler.h \
compoundhandler.h sectionhandler.h \
memberhandler.h paramhandler.h \
dochandler.h linkedtexthandler.h
dochandler.h linkedtexthandler.h \
debug.h
SOURCES = mainhandler.cpp \
compoundhandler.cpp sectionhandler.cpp \
memberhandler.cpp paramhandler.cpp \
dochandler.cpp linkedtexthandler.cpp
dochandler.cpp linkedtexthandler.cpp \
basehandler.cpp debug.cpp
unix:LIBS += -L../../../lib -lqtools
win32:INCLUDEPATH += .
win32-mingw:LIBS += -L../../../lib -lqtools
......
......@@ -3,7 +3,7 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......@@ -13,6 +13,7 @@
*
*/
#include "linkedtexthandler.h"
#include "debug.h"
#include <doxmlintf.h>
class LT_Text : public ILT_Text
......@@ -79,7 +80,7 @@ void LinkedTextHandler::end()
if (!m_curString.isEmpty())
{
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_parent->setDelegate(0);
......@@ -90,7 +91,7 @@ void LinkedTextHandler::startRef(const QXmlAttributes& attrib)
if (!m_curString.isEmpty())
{
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="";
}
ASSERT(m_ref==0);
......@@ -98,15 +99,34 @@ void LinkedTextHandler::startRef(const QXmlAttributes& attrib)
m_ref->setRefId(attrib.value("refid"));
m_ref->setExtId(attrib.value("external"));
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()
{
m_ref->setText(m_curString);
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;
}
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 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......@@ -36,6 +36,7 @@ class LinkedTextHandler : public BaseHandler<LinkedTextHandler>
virtual void end();
virtual void startRef(const QXmlAttributes& attrib);
virtual void endRef();
static QString toString(const QList<ILinkedText> &list);
private:
IBaseHandler *m_parent;
......
......@@ -3,7 +3,7 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......@@ -15,112 +15,261 @@
#include <qxml.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_memberNameDict.setAutoDelete(TRUE);
addStartHandler("doxygen");
addStartHandler("compounddef",this,&MainHandler::startCompound);
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()
{
printf("MainHandler::~MainHandler()\n");
debug(2,"MainHandler::~MainHandler()\n");
}
void MainHandler::startCompound(const QXmlAttributes& attrib)
{
CompoundHandler *compHandler = new CompoundHandler(this);
compHandler->startCompound(attrib);
m_compounds.append(compHandler);
m_curCompound = new CompoundEntry(257);
m_curCompound->id = attrib.value("id");
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];
if (ml)
{
ml->append(h);
}
else
{
ml = new QList<IMember>;
ml->append(h);
m_memberNameDict.insert(name,ml);
}
m_curCompound->name = m_curString;
}
void MainHandler::initialize()
void MainHandler::startMember(const QXmlAttributes& attrib)
{
QListIterator<ICompound> mci(m_compounds);
CompoundHandler *compHandler;
for (;(compHandler=(CompoundHandler *)mci.current());++mci)
{
compHandler->initialize(this);
m_compoundNameDict.insert(compHandler->name(),compHandler);
m_compoundDict.insert(compHandler->id(),compHandler);
}
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);
}
// for each member
QDictIterator< QList<IMember> > mndi(m_memberNameDict);
QList<IMember> *ml;
for (;(ml=mndi.current());++mndi)
{
QListIterator<IMember> mli(*ml);
IMember *mem;
for (;(mem=mli.current());++mli)
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)
{
((MemberHandler*)mem)->initialize(this);
}
cel = new QList<CompoundEntry>;
m_memberNameDict.insert(m_curString,cel);
}
cel->append(m_curCompound);
}
void MainHandler::setDebugLevel(int level)
{
::setDebugLevel(level);
}
class ErrorHandler : public QXmlErrorHandler
void MainHandler::dump()
{
public:
virtual ~ErrorHandler() {}
bool warning( const QXmlParseException & )
QListIterator<CompoundEntry> cli(m_compounds);
CompoundEntry *ce;
for (cli.toFirst();(ce=cli.current());++cli)
{
return FALSE;
}
bool error( const QXmlParseException & )
debug(2,"compound id=`%s' name=`%s'\n",ce->id.data(),ce->name.data());
QDictIterator<MemberEntry> mdi(ce->memberDict);
MemberEntry *me;
for (mdi.toFirst();(me=mdi.current());++mdi)
{
return FALSE;
debug(2," member id=`%s' name=`%s'\n",me->id.data(),me->name.data());
}
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:
QString errorMsg;
};
}
IDoxygen *createObjectModelFromXML(const char * xmlFileName)
bool MainHandler::readXMLDir(const char * xmlDirName)
{
m_xmlDirName = xmlDirName;
QString xmlFileName=m_xmlDirName+"/index.xml";
QFile xmlFile(xmlFileName);
MainHandler * handler = new MainHandler;
//printf("Trying %s xmlFile.exists()=%d isReadable()=%d\n",
// xmlFileName.data(),xmlFile.exists(),xmlFile.isReadable());
if (xmlFile.exists())
{
ErrorHandler errorHandler;
QXmlInputSource source( xmlFile );
QXmlSimpleReader reader;
reader.setContentHandler( handler );
reader.setContentHandler( this );
reader.setErrorHandler( &errorHandler );
reader.parse( source );
printf("<---------- initialize ----------->\n");
handler->initialize();
printf("<-------- end initialize --------->\n");
return handler;
dump();
return TRUE;
}
return FALSE;
}
ICompoundIterator *MainHandler::compounds() const
{
return new CompoundEntryIterator(this,m_compounds);
}
ICompound *MainHandler::compoundById(const QString &id) const
{
if (id.isEmpty()) return 0;
CompoundHandler *ch = m_compoundsLoaded[id];
if (ch) // compound already in memory
{
ch->addref(); // returning alias -> increase reference counter
return ch;
}
CompoundEntry *ce = m_compoundDict.find(id);
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;
}
void MainHandler::unloadCompound(CompoundHandler *ch)
{
m_compoundsLoaded.remove(ch->id());
}
ICompound *MainHandler::compoundByName(const QString &name) const
{
if (name.isEmpty()) return 0;
CompoundEntry *ce = m_compoundNameDict[name];
if (ce==0) return 0; // name not found
return compoundById(ce->id);
}
ICompound *MainHandler::memberById(const QString &id) const
{
if (id.isEmpty()) return 0;
MemberEntry *me = m_memberDict[id];
if (me==0) return 0; // id not found
return compoundById(me->id);
}
ICompoundIterator *MainHandler::memberByName(const QString &name) const
{
if (name.isEmpty()) return 0;
QList<CompoundEntry> *cel = m_memberNameDict[name];
if (cel==0) return 0; // name not found
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 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......@@ -22,47 +22,60 @@
#include <doxmlintf.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>
{
public:
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();
virtual ~MainHandler();
ICompoundIterator *compounds() const
{
return new CompoundIterator(m_compounds);
}
ICompound *compoundById(const QString &id) 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);
// IDoxygen
ICompoundIterator *compounds() const;
ICompound *compoundById(const QString &id) const;
virtual ICompound *compoundByName(const QString &name) const;
virtual ICompound *memberById(const QString &id) const;
virtual ICompoundIterator *memberByName(const QString &name) const;
void initialize();
virtual void release();
void setDebugLevel(int level);
bool readXMLDir(const char *dirName);
void dump();
void unloadCompound(CompoundHandler *ch);
private:
QList<ICompound> m_compounds;
QDict<ICompound> m_compoundDict;
QDict<ICompound> m_compoundNameDict;
QDict<IMember> m_memberDict;
QDict<QList<IMember> > m_memberNameDict;
CompoundEntry *m_curCompound;
MemberEntry *m_curMember;
QList<CompoundEntry> m_compounds;
QDict<CompoundEntry> m_compoundDict;
QDict<CompoundEntry> m_compoundNameDict;
QDict<MemberEntry> m_memberDict;
QDict<QList<CompoundEntry> > m_memberNameDict;
QString m_xmlDirName;
QDict<CompoundHandler> m_compoundsLoaded;
};
#endif
......@@ -3,7 +3,7 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......@@ -18,6 +18,53 @@
#include "dochandler.h"
#include "mainhandler.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)
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()
//------------------------------------------------------------------------------
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);
addStartHandler("type",this,&MemberHandler::startType);
......@@ -110,6 +159,9 @@ MemberHandler::MemberHandler(IBaseHandler *parent)
addStartHandler("location",this,&MemberHandler::startLocation);
addEndHandler("location");
m_type.setAutoDelete(TRUE);
m_initializer.setAutoDelete(TRUE);
m_exception.setAutoDelete(TRUE);
m_params.setAutoDelete(TRUE);
m_references.setAutoDelete(TRUE);
m_referencedBy.setAutoDelete(TRUE);
......@@ -124,22 +176,25 @@ MemberHandler::MemberHandler(IBaseHandler *parent)
MemberHandler::~MemberHandler()
{
debug(2,"MemberHandler::~MemberHandler() %p\n",this);
delete m_brief;
delete m_detailed;
delete m_linkedTextHandler;
delete m_reimplements;
}
void MemberHandler::startMember(const QXmlAttributes& attrib)
{
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_virtualness = attrib.value("virt");
m_protection = attrib.value("prot");
m_isConst = attrib.value("const")=="yes";
m_isVolatile = attrib.value("volatile")=="yes";
printf("member kind=`%s' id=`%s' prot=`%s' virt=`%s'\n",
m_kind.data(),m_id.data(),m_protection.data(),m_virtualness.data());
debug(2,"member kind=`%s' id=`%s' prot=`%s' virt=`%s'\n",
m_kindString.data(),m_id.data(),m_protection.data(),m_virtualness.data());
}
void MemberHandler::startBriefDesc(const QXmlAttributes& attrib)
......@@ -226,7 +281,7 @@ void MemberHandler::endMember()
void MemberHandler::startType(const QXmlAttributes &)
{
printf("startType!\n");
debug(2,"startType!\n");
delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_type);
m_linkedTextHandler->start("type");
......@@ -234,7 +289,7 @@ void MemberHandler::startType(const QXmlAttributes &)
void MemberHandler::startInitializer(const QXmlAttributes &)
{
printf("startInitializer!\n");
debug(2,"startInitializer!\n");
delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_initializer);
m_linkedTextHandler->start("initializer");
......@@ -242,7 +297,7 @@ void MemberHandler::startInitializer(const QXmlAttributes &)
void MemberHandler::startException(const QXmlAttributes &)
{
printf("startException!\n");
debug(2,"startException!\n");
delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_exception);
m_linkedTextHandler->start("exception");
......@@ -251,7 +306,7 @@ void MemberHandler::startException(const QXmlAttributes &)
void MemberHandler::endName()
{
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)
......@@ -297,3 +352,25 @@ void MemberHandler::initialize(MainHandler *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 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......@@ -28,6 +28,8 @@
#include "dochandler.h"
class MainHandler;
class CompoundHandler;
class SectionHandler;
struct MemberReference : public IMemberReference
{
......@@ -48,13 +50,6 @@ class MemberReferenceIterator : public BaseIterator<IMemberReferenceIterator,IMe
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>
{
public:
......@@ -116,8 +111,12 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler>
virtual ~MemberHandler();
// IMember implementation
virtual QString kind() const
virtual ICompound *compound() const;
virtual ISection *section() const;
virtual MemberKind kind() const
{ return m_kind; }
virtual QString kindString() const
{ return m_kindString; }
virtual QString id() const
{ return m_id; }
virtual QString protection() const
......@@ -132,6 +131,8 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler>
{ return m_isVolatile; }
virtual ILinkedTextIterator *type() const
{ return new LinkedTextIterator(m_type); }
virtual QString typeString() const
{ return LinkedTextHandler::toString(m_type); }
virtual IParamIterator *params() const
{ return new ParamIterator(m_params); }
virtual IMemberReferenceIterator *references() const
......@@ -162,10 +163,15 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler>
{ return m_detailed; }
void initialize(MainHandler *m);
void setCompoundHandler(CompoundHandler *c);
void setSectionHandler(SectionHandler *s);
private:
IBaseHandler *m_parent;
QString m_kind;
CompoundHandler *m_compound;
SectionHandler *m_section;
MemberKind m_kind;
QString m_kindString;
QString m_id;
QString m_protection;
QString m_virtualness;
......@@ -190,4 +196,14 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler>
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
......@@ -3,7 +3,7 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......@@ -15,6 +15,7 @@
#include "paramhandler.h"
#include "memberhandler.h"
#include "debug.h"
ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent)
{
......@@ -41,12 +42,13 @@ ParamHandler::ParamHandler(IBaseHandler *parent) : m_parent(parent)
ParamHandler::~ParamHandler()
{
delete m_linkedTextHandler;
}
void ParamHandler::startParam(const QXmlAttributes& /*attrib*/)
{
m_parent->setDelegate(this);
printf("param\n");
debug(2,"param\n");
}
void ParamHandler::endParam()
......@@ -59,39 +61,39 @@ void ParamHandler::startType(const QXmlAttributes& /*attrib*/)
delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_type);
m_linkedTextHandler->start("type");
printf("param type\n");
debug(2,"param type\n");
}
void ParamHandler::endDeclName()
{
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()
{
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()
{
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()
{
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*/)
{
delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_defVal);
m_linkedTextHandler->start("type");
printf("member defVal\n");
m_linkedTextHandler->start("defval");
debug(2,"member defVal\n");
}
......
......@@ -3,7 +3,7 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -3,7 +3,7 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......@@ -16,9 +16,74 @@
#include "mainhandler.h"
#include "compoundhandler.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)
{
//printf("SectionHandler::SectionHandler()\n");
m_members.setAutoDelete(TRUE);
addEndHandler("sectiondef",this,&SectionHandler::endSection);
addStartHandler("memberdef",this,&SectionHandler::startMember);
......@@ -26,13 +91,15 @@ SectionHandler::SectionHandler(IBaseHandler *parent) : m_parent(parent)
SectionHandler::~SectionHandler()
{
debug(2,"SectionHandler::~SectionHandler()\n");
}
void SectionHandler::startSection(const QXmlAttributes& attrib)
{
m_parent->setDelegate(this);
m_kind = attrib.value("kind");
printf("section kind=`%s'\n",m_kind.data());
m_kindString = attrib.value("kind");
m_kind = s_typeMap->map(m_kindString);
debug(2,"section kind=`%s'\n",m_kindString.data());
}
void SectionHandler::endSection()
......@@ -47,14 +114,15 @@ void SectionHandler::startMember(const QXmlAttributes& attrib)
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;
for (;(mh=(MemberHandler *)mli.current());++mli)
for (;(mh=mli.current());++mli)
{
m->insertMemberById(mh->id(),mh);
m->insertMemberByName(mh->name(),mh);
mh->setCompoundHandler(ch);
ch->insertMember(mh);
mh->setSectionHandler(this);
}
}
......
......@@ -3,7 +3,7 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......@@ -47,16 +47,43 @@ class SectionHandler : public ISection, public BaseHandler<SectionHandler>
virtual ~SectionHandler();
// 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
{ 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:
IBaseHandler *m_parent;
QString m_kind;
QList<IMember> m_members;
SectionKind m_kind;
QString m_kindString;
QList<MemberHandler> m_members;
};
void sectionhandler_init();
void sectionhandler_exit();
#endif
......@@ -3,7 +3,7 @@
* $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
* documentation under the terms of the GNU General Public License is hereby
......@@ -312,11 +312,17 @@ int main(int argc,char **argv)
{
if (argc!=2)
{
printf("Usage: %s file.xml\n",argv[0]);
printf("Usage: %s xmldir\n",argv[0]);
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();
ICompound *comp;
......@@ -324,12 +330,12 @@ int main(int argc,char **argv)
for (cli->toFirst();(comp=cli->current());cli->toNext())
{
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();
ISection *sec;
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();
IMember *mem;
for (mli->toFirst();(mem=mli->current());mli->toNext())
......@@ -412,6 +418,7 @@ int main(int argc,char **argv)
printf("===== detailed description ==== \n");
DumpDoc(doc);
}
comp->release();
}
cli->release();
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
# 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
# documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* 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
# documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -415,7 +415,7 @@ TMAKE_CXXFLAGS += -DENGLISH_ONLY
EOF
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
SRC=$i
......@@ -447,7 +447,7 @@ EOF
echo " Created $DST from $SRC..."
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
SRC=$i
......
......@@ -13,7 +13,7 @@
# input used in their production; they are not affected by this license.
all: language FORCE
@xcopy /y /s /q /i ..\examples ..\html\examples
@xcopy /s /q /i ..\examples ..\html\examples
set DOXYGEN_DOCDIR=. & \
set VERSION=$(VERSION) & \
$(DOXYGEN)\bin\doxygen
......
......@@ -13,7 +13,7 @@
# input used in their production; they are not affected by this license.
all: language FORCE
@xcopy /y /s /q /i ..\examples ..\html\examples
@xcopy /s /q /i ..\examples ..\html\examples
set DOXYGEN_DOCDIR=.
set VERSION=$(VERSION)
$(DOXYGEN)\bin\doxygen
......
......@@ -93,9 +93,11 @@ followed by the descriptions of the tags grouped by category.
<li> \refitem cfg_example_recursive EXAMPLE_RECURSIVE
<li> \refitem cfg_exclude EXCLUDE
<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_only_predef EXPAND_ONLY_PREDEF
<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_extract_all EXTRACT_ALL
<li> \refitem cfg_extract_local_classes EXTRACT_LOCAL_CLASSES
......@@ -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
\c FILE_PATTERNS tag to specify one or more wildcard patterns
(like \c *.cpp and \c *.h ) to filter out the source-files
in the directories. If left blank all files are included
(i.e. wildcard <tt>*</tt>).
in the directories. If left blank the following patterns are tested:
<code>
*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
*.h++ *.idl *.odl
</code>
\anchor cfg_recursive
<dt>\c RECURSIVE <dd>
......@@ -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
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
<dt>\c EXCLUDE_PATTERNS <dd>
\addindex EXCLUDE_PATTERNS
......@@ -1168,6 +1179,13 @@ TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
in the class index. If set to \c NO only the inherited external classes
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
<dt>\c PERL_PATH <dd>
\addindex PERL_PATH
......
......@@ -66,6 +66,9 @@ tools should be installed.
\latexonly(see {\tt http://www.research.att.com/sw/tools/graphviz/})\endlatexonly.
Needed for the include dependency 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.
</ul>
......
......@@ -60,7 +60,7 @@ when the translator was updated.
<TD>Chinese</TD>
<TD>Wei Liu<br>Wang Weihan</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 BGCOLOR="#ffffff">
<TD>Croatian</TD>
......@@ -213,7 +213,7 @@ when the translator was updated.
\hline
Brazilian & Fabio "FJTC" Jun Takada Chino & {\tt chino@icmc.sc.usp.br} & up-to-date \\
\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} & \\
\hline
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
not such a method in your translator adapter base class, you probably
can change the translator adapter base to the newer one.
Do not blindly implement all methods that are implemented by your
translator adapter base class. The reason is that the adapter
Probably the easiest approach of the gradual update is to look at
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
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
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
not such a method in your translator adapter base class, you probably
can change the translator adapter base to the newer one.
Do not blindly implement all methods that are implemented by your
translator adapter base class. The reason is that the adapter
Probably the easiest approach of the gradual update is to look at
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
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
complicated adapters. Because of that, doxygen developers may decide
......
......@@ -95,6 +95,21 @@
# as "obsolete" in the status (i.e. no guessing when it was last updated).
# 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;
......@@ -193,7 +208,7 @@ sub GetPureVirtualFrom ##{{{
################################################################
# StripArgIdentifiers takes a method prototype (one line string),
# removes the argument identifiers, and returns only the necessary
# form of the prototype.
# form of the prototype as the function result.
#
sub StripArgIdentifiers ##{{{
{
......@@ -234,7 +249,7 @@ sub StripArgIdentifiers ##{{{
# Whitespaces are not only spaces. Moreover, the difference
# 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 whitespace by a single, real space.
# of whitespaces by a single, real space.
#
$arg =~ s{\s+}{ }g;
......@@ -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
# generates the content as expected in the $flangdoc file (the
......@@ -684,6 +842,7 @@ xxxTABLE_FOOTxxx
}
##}}}
################################################################
# CopyTemplateToLanguageDoc takes the $flangtpl template and
# generates $flangdoc without using information from other
......@@ -816,7 +975,8 @@ print STDERR "\n\n";
closedir DIR; # ignore names with dot at the beginning
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;
##}}}
......@@ -833,12 +993,14 @@ print STDERR "\n\n";
my $output = '';
my %details = ();
# Initialize the list of the required methods.
#
my %required = ();
# Remove the argument identifiers from the method prototypes
# to get only the required form of the prototype. Fill the
# hash with them. #{{{
#
my %required = ();
foreach (@expected) {
my $prototype = StripArgIdentifiers($_);
$required{$prototype} = 1;
......@@ -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. #{{{
#
print FOUT "\n\n" .'-' x 70 . "\n";
print FOUT "\n" .'-' x 70 . "\n";
print FOUT "Localized translators are expected to implement "
. "the following methods\n"
. "(prototypes sorted aplhabetically):\n\n";
foreach (sort @expected) {
print FOUT "$_\n";
}
foreach (sort @expected) { print FOUT "$_\n"; }
##}}}
# If there are some details for the translators, show them. #{{{
......
Summary: A documentation system for C/C++.
Name: doxygen
Version: 1.2.13.1
Summary: documentation system for C, C++ and IDL
Release: 4
Source: doxygen-%{version}.src.tar.gz
Version: 1.2.13_20020121
Release: 1
Epoch: 1
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
Group: unsorted
URL: http://www.stack.nl/~dimitri/doxygen
Packager: Matthias Andree <ma@dt.e-technik.uni-dortmund.de>
BuildRoot: /var/tmp/doxygen-%{version}.root
%description
Doxygen can generate an online class browser (in HTML) and/or a
reference manual (in LaTeX) from a set of documented source files. The
documentation is extracted directly from the sources. Doxygen can
also be configured to extract the code structure from undocumented
source files.
# requires Perl for tmake (Troll's make)
BuildPrereq: perl tetex
%package doxywizard
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
Doxygen is a documentation system for C and C++. It can generate an
on-line class browser (in HTML) and/or an off-line reference manual
(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>
%description doxywizard
Doxywizard is a GUI for creating and editing configuration files that
are used by doxygen.
%prep
%setup -n doxygen-%{version}
%setup -q
%patch -p1 -b .redhat
%patch1 -p1 -b .qt2
%build
CFLAGS="$RPM_OPT_FLAGS" ./configure --with-doxywizard
# the next path is Suse specific
QTDIR=/usr/lib/qt2
PATH=${QTDIR}/bin:$PATH
export QTDIR PATH
make
QTDIR="" && . /etc/profile.d/qt.sh
export OLD_PO_FILE_INPUT=yes
./configure --prefix %{_prefix} --shared --release --with-doxywizard
make all docs
%install
rm -rf $RPM_BUILD_ROOT
make install install_docs INSTALL=$RPM_BUILD_ROOT/usr \
DOCDIR=$RPM_BUILD_ROOT%{_docdir}/doxygen
install -m 644 LICENSE LANGUAGE.HOWTO PLATFORMS README VERSION \
$RPM_BUILD_ROOT%{_docdir}/doxygen
rm -rf ${RPM_BUILD_ROOT}
export OLD_PO_FILE_INPUT=yes
make install INSTALL=$RPM_BUILD_ROOT%{_prefix}
find $RPM_BUILD_ROOT -name CVS -type d -depth -exec rm -r {} \;
%clean
rm -rf ${RPM_BUILD_ROOT}
%files
%defattr(-,root,root)
%attr(755,root,root) /usr/bin/*
%doc %{_docdir}/doxygen
%doc LANGUAGE.HOWTO README examples html
%{_bindir}/doxygen
%{_bindir}/doxysearch
%{_bindir}/doxytag
%clean
rm -rf $RPM_BUILD_ROOT
%files doxywizard
%defattr(-,root,root)
%{_bindir}/doxywizard
%changelog
* Sun Jun 10 2001 Matthias Andree <ma@dt.e-technik.uni-dortmund.de>
- update to 1.2.8.1
* Tue Jun 5 2001 Matthias Andree <ma@dt.e-technik.uni-dortmund.de>
- update to 1.2.8
- enable XML-Generator
* Mon Apr 16 2001 Jens Seidel <jensseidel@users.sourceforge.net>
- new decription (english, german)
- use of %{_docdir}
- added README, LICENSE, ... to install section
* Mon Mar 13 2000 Matthias Andree <ma@dt.e-technik.uni-dortmund.de>
- inital version build with rpmify
* Sun Jan 06 2002 Than Ngo <than@redhat.com> 1.2.13.1-1
- update to 1.2.13.1
* Sun Dec 30 2001 Jeff Johnson <jbj@redhat.com> 1.2.13-1
- update to 1.2.13
* Sun Nov 18 2001 Than Ngo <than@redhat.com> 1.2.12-1
- update to 1.2.12
- s/Copyright/License
* 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 @@
#
#
#
# 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
# documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......@@ -179,6 +179,18 @@ void ClassDef::addMembersToMemberGroup()
::addMembersToMemberGroup(&friends,memberGroupSDict,this);
::addMembersToMemberGroup(&related,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
......@@ -722,7 +734,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
}
ol.writeSynopsis();
if (m_incInfo)
if (m_incInfo && Config_getBool("SHOW_INCLUDE_FILES"))
{
QCString nm=m_incInfo->includeName.isEmpty() ?
(m_incInfo->fileDef ?
......@@ -992,7 +1004,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
else // add this group to the corresponding member section
{
//printf("addToDeclarationSection(%s)\n",mg->header().data());
mg->addToDeclarationSection();
//mg->addToDeclarationSection();
}
}
......@@ -1299,7 +1311,9 @@ void ClassDef::writeMemberList(OutputList &ol)
ol.writeString("</td>");
memberWritten=TRUE;
}
else if (!Config_getBool("HIDE_UNDOC_MEMBERS")) // no documentation,
else if (!Config_getBool("HIDE_UNDOC_MEMBERS") &&
(md->protection()!=Private || Config_getBool("EXTRACT_PRIVATE") || md->isFriend())
) // no documentation,
// generate link to the class instead.
{
//ol.writeListItem();
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* 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
writeMultiLineCodeLink(ol,d->getReference(),d->getOutputFileBase(),md->getBodyAnchor(),clName);
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);
}
if (Config_getBool("REFERENCES_RELATION") && g_currentMemberDef->isFunction())
if (Config_getBool("REFERENCES_RELATION") &&
(g_currentMemberDef->isFunction() || g_currentMemberDef->isSlot())
)
{
g_currentMemberDef->addSourceReferences(md);
}
......@@ -710,11 +714,15 @@ static bool getLink(const char *className,
if (g_currentDefinition && g_currentMemberDef &&
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);
}
if (Config_getBool("REFERENCES_RELATION") && g_currentMemberDef->isFunction())
if (Config_getBool("REFERENCES_RELATION") &&
(g_currentMemberDef->isFunction() || g_currentMemberDef->isSlot())
)
{
g_currentMemberDef->addSourceReferences(md);
}
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......@@ -31,7 +31,6 @@
#include <qstack.h>
#include "config.h"
#include "lang_cfg.h"
#include "version.h"
#undef Config_getString
......@@ -1045,6 +1044,7 @@ void Config::check()
filePatternList.append("*.hpp");
filePatternList.append("*.h++");
filePatternList.append("*.idl");
filePatternList.append("*.odl");
}
// add default pattern if needed
......@@ -1602,8 +1602,8 @@ void Config::create()
"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"
"blank the following patterns are tested: \n"
"*.c *.cc *.cxx *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp \n"
"*.h++ *.idl \n"
"*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp \n"
"*.h++ *.idl *.odl\n"
);
cb = addBool(
"RECURSIVE",
......@@ -1618,6 +1618,12 @@ void Config::create()
"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"
);
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 = addList(
"EXCLUDE_PATTERNS",
......@@ -2134,6 +2140,13 @@ void Config::create()
"will be listed. \n",
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(
"PERL_PATH",
"The PERL_PATH should be the absolute path and name of the perl script \n"
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......@@ -416,7 +416,7 @@ void Definition::writeSourceRefList(OutputList &ol,const char *scopeName,
{
ol.docify(name);
}
if (md->isFunction()) ol.docify("()");
if (md->isFunction() && md->isSlot()) ol.docify("()");
}
index=newIndex+matchLen;
}
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......@@ -5221,6 +5221,7 @@ static void buildPageList(Entry *root)
{
if (root->section == Entry::PAGEDOC_SEC)
{
//printf("buildPageList %s\n",root->name.data());
if (!root->name.isEmpty())
{
addRelatedPage(root);
......@@ -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());
}
else if (cfi->isFile() &&
(!Config_getBool("EXCLUDE_SYMLINKS") || !cfi->isSymLink()) &&
(patList==0 || patternMatch(cfi,patList)) &&
!patternMatch(cfi,exclPatList))
{
......@@ -6069,6 +6071,7 @@ static int readDir(QFileInfo *fi,
if (resultDict) resultDict->insert(cfi->absFilePath(),rs);
}
else if (recursive &&
(!Config_getBool("EXCLUDE_SYMLINKS") || !cfi->isSymLink()) &&
cfi->isDir() && cfi->fileName()!="." &&
cfi->fileName()!="..")
{
......@@ -6150,7 +6153,9 @@ static int readFileOrDirectory(const char *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())
{
if (fi.isFile())
{
totalSize+=fi.size()+fi.absFilePath().length()+4; //readFile(&fi,fiList,input);
//fiList->inSort(new FileInfo(fi));
......@@ -6181,11 +6186,14 @@ static int readFileOrDirectory(const char *s,
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;
}
......@@ -6226,7 +6234,7 @@ static void readFormulaRepository()
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("1) Use doxygen to generate a template configuration file:\n");
msg(" %s [-s] -g [configName]\n\n",name);
......
......@@ -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
* 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
# documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......@@ -505,7 +505,7 @@ void parseFileOrDir(const char *fileName)
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);
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);
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* documentation under the terms of the GNU General Public License is hereby
......
......@@ -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
* 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