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

Release-1.2.18-20021030

parent dc404b51
DOXYGEN Version 1.2.18-20021020
DOXYGEN Version 1.2.18-20021030
Please read the installation section of the manual for instructions.
--------
Dimitri van Heesch (20 October 2002)
Dimitri van Heesch (30 October 2002)
DOXYGEN Version 1.2.18_20021020
DOXYGEN Version 1.2.18_20021030
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) (20 October 2002)
Dimitri van Heesch (dimitri@stack.nl) (30 October 2002)
1.2.18-20021020
1.2.18-20021030
......@@ -16,7 +16,16 @@
#ifndef _DOXMLINTF_H
#define _DOXMLINTF_H
#include <qstring.h>
/*! \file
* \brief The interface to the object model provided by the XML parser
* library.
*
* To start using this library one calls createObjectModel and then
* uses the returned IDoxygen interface to read doxygen generated
* XML output and navigate through the information contained in it.
*
* @see createObjectModel()
*/
class IMember;
class IDocIterator;
......@@ -24,12 +33,20 @@ class ICompound;
class ISection;
class INode;
/*! \brief Read only interface to a string.
*/
class IString
{
public:
/*! Returns a latin1 character representation of the string. */
virtual const char *latin1() const = 0;
/*! Returns a 16-bit unicode character representation of the character at
* position \a index in the string. The first character is at index 0.
*/
virtual unsigned short unicodeCharAt(int index) const = 0;
/*! Returns true if this string is empty or false otherwise */
virtual bool isEmpty() const = 0;
/*! Returns the number of characters in the string. */
virtual int length() const = 0;
};
......@@ -107,24 +124,6 @@ class IMemberReferenceIterator
virtual void release() = 0;
};
class IEnumValue
{
public:
virtual const IString * name() const = 0;
virtual const IString * initializer() const = 0;
};
class IEnumValueIterator
{
public:
virtual IEnumValue *toFirst() = 0;
virtual IEnumValue *toLast() = 0;
virtual IEnumValue *toNext() = 0;
virtual IEnumValue *toPrev() = 0;
virtual IEnumValue *current() const = 0;
virtual void release() = 0;
};
class IDoc
{
public:
......@@ -161,8 +160,9 @@ class IDoc
Entry, // 28 -> IDocEntry
Section, // 29 -> IDocSection
Preformatted, // 30 -> IDocPreformatted
Symbol, // 31 -> IDocSymbol
Root // 32 -> IDocRoot
Verbatim, // 31 -> IDocVerbatim
Symbol, // 32 -> IDocSymbol
Root // 33 -> IDocRoot
};
virtual Kind kind() const = 0;
};
......@@ -399,6 +399,12 @@ class IDocPreformatted : public IDoc
virtual IDocIterator *contents() const = 0;
};
class IDocVerbatim : public IDoc
{
public:
virtual const IString *text() const = 0;
};
class IDocSymbol : public IDoc
{
public:
......@@ -499,7 +505,8 @@ class IMember
public:
enum MemberKind { Invalid=0,
Define, Property, Variable, Typedef, Enum,
Function, Signal, Prototype, Friend, DCOP, Slot
Function, Signal, Prototype, Friend, DCOP, Slot,
EnumValue
};
virtual ICompound *compound() const = 0;
virtual ISection *section() const = 0;
......@@ -525,11 +532,80 @@ class IMember
virtual int definitionLine() const = 0;
virtual IMemberReference *reimplements() const = 0;
virtual IMemberReferenceIterator *reimplementedBy() const = 0;
virtual IEnumValueIterator *enumValues() const = 0;
virtual IDocRoot *briefDescription() const = 0;
virtual IDocRoot *detailedDescription() const = 0;
};
class IDefine : public IMember
{
public:
};
class IProperty : public IMember
{
public:
};
class IVariable : public IMember
{
public:
};
class ITypedef : public IMember
{
public:
};
class IFunction : public IMember
{
public:
};
class ISignal : public IMember
{
public:
};
class IPrototype : public IMember
{
public:
};
class IFriend : public IMember
{
public:
};
class IDCOP : public IMember
{
public:
};
class ISlot : public IMember
{
public:
};
class IEnumValue : public IMember
{
public:
virtual const IString * name() const = 0;
};
#if 0
class IEnumValueIterator
{
public:
virtual IEnumValue *toFirst() = 0;
virtual IEnumValue *toLast() = 0;
virtual IEnumValue *toNext() = 0;
virtual IEnumValue *toPrev() = 0;
virtual IEnumValue *current() const = 0;
virtual void release() = 0;
};
#endif
class IMemberIterator
{
public:
......@@ -541,6 +617,12 @@ class IMemberIterator
virtual void release() = 0;
};
class IEnum : public IMember
{
public:
virtual IMemberIterator *enumValues() const = 0;
};
/*! \brief The interface to a section in the object model.
*
* A compound can have a number of sections, where each
......
......@@ -19,6 +19,7 @@
#include "debug.h"
#include "graphhandler.h"
#include "sectionhandler.h"
#include "loamhandler.h"
//----------------------------------------------------------------------------
......@@ -146,7 +147,7 @@ CompoundHandler::CompoundHandler(const QString &xmlDir)
m_xmlDir(xmlDir), m_refCount(1), m_memberDict(257), m_memberNameDict(257),
m_mainHandler(0), m_inheritanceGraph(0), m_collaborationGraph(0),
m_includeDependencyGraph(0), m_includedByDependencyGraph(0), m_templateParamList(0),
m_titleHandler(0)
m_titleHandler(0), m_members(0)
{
m_superClasses.setAutoDelete(TRUE);
m_subClasses.setAutoDelete(TRUE);
......@@ -202,12 +203,10 @@ CompoundHandler::CompoundHandler(const QString &xmlDir)
addEndHandler("innergroup");
addStartHandler("templateparamlist",this,&CompoundHandler::startTemplateParamList);
addEndHandler("templateparamlist");
addStartHandler("param",this,&CompoundHandler::startParam);
addEndHandler("param");
addStartHandler("title",this,&CompoundHandler::startTitle);
addStartHandler("listofallmembers",this,&CompoundHandler::startListOfAllMembers);
}
CompoundHandler::~CompoundHandler()
......@@ -221,6 +220,8 @@ CompoundHandler::~CompoundHandler()
delete m_collaborationGraph;
delete m_includeDependencyGraph;
delete m_includedByDependencyGraph;
delete m_templateParamList;
delete m_members;
}
void CompoundHandler::startSection(const QXmlAttributes& attrib)
......@@ -298,17 +299,16 @@ void CompoundHandler::startInnerGroup(const QXmlAttributes& attrib)
m_innerCompounds.append(new QString(attrib.value("refid")));
}
void CompoundHandler::startParam(const QXmlAttributes& attrib)
void CompoundHandler::startTemplateParamList(const QXmlAttributes& attrib)
{
ParamHandler *ph = new ParamHandler(this);
ph->startParam(attrib);
m_params.append(ph);
m_templateParamList = new TemplateParamListHandler(this);
m_templateParamList->startTemplateParamList(attrib);
}
void CompoundHandler::startTemplateParamList(const QXmlAttributes& attrib)
void CompoundHandler::startListOfAllMembers(const QXmlAttributes& attrib)
{
m_templateParamList = new TemplateParamListHandler(this);
m_templateParamList->startParam(attrib);
m_members = new ListOfAllMembersHandler(this);
m_members->startListOfAllMembers(attrib);
}
void CompoundHandler::addSuperClass(const QXmlAttributes& attrib)
......@@ -388,11 +388,16 @@ void CompoundHandler::initialize(MainHandler *mh)
{
sec->initialize(this);
}
if (m_members)
{
m_members->initialize(mh);
}
}
void CompoundHandler::insertMember(MemberHandler *mh)
{
m_memberDict.insert(mh->id()->latin1(),mh);
mh->initialize(m_mainHandler);
QList<MemberHandler> *mhl = m_memberNameDict.find(mh->id()->latin1());
if (mhl==0)
{
......@@ -478,7 +483,7 @@ IDocRoot *CompoundHandler::detailedDescription() const
IMember *CompoundHandler::memberById(const char *id) const
{
return m_memberDict[id];
return (IFunction*)m_memberDict[id];
}
IGraph *CompoundHandler::inheritanceGraph() const
......@@ -530,3 +535,10 @@ const IDocTitle *CompoundHandler::title() const
{
return m_titleHandler;
}
IMemberReferenceIterator *CompoundHandler::members() const
{
return m_members ? m_members->members() : 0;
}
......@@ -34,6 +34,7 @@ class SectionHandler;
class ParamHandler;
class TemplateParamListHandler;
class TitleHandler;
class ListOfAllMembersHandler;
class RelatedCompound : public IRelatedCompound
{
......@@ -97,9 +98,9 @@ class CompoundHandler : public IClass,
virtual void startInnerNamespace(const QXmlAttributes& attrib);
virtual void startInnerFile(const QXmlAttributes& attrib);
virtual void startInnerGroup(const QXmlAttributes& attrib);
virtual void startParam(const QXmlAttributes& attrib);
virtual void startTitle(const QXmlAttributes& attrib);
virtual void startTemplateParamList(const QXmlAttributes& attrib);
virtual void startListOfAllMembers(const QXmlAttributes& attrib);
virtual void addref() { m_refCount++; }
CompoundHandler(const QString &dirName);
......@@ -133,6 +134,7 @@ class CompoundHandler : public IClass,
int locationLine() const { return m_defLine; }
int locationBodyStartLine() const { return m_defBodyStart; }
int locationBodyEndLine() const { return m_defBodyEnd; }
IMemberReferenceIterator *members() const;
// IFile implementation
IGraph *includeDependencyGraph() const;
......@@ -171,6 +173,7 @@ class CompoundHandler : public IClass,
ProgramListingHandler* m_source;
TemplateParamListHandler* m_templateParamList;
TitleHandler* m_titleHandler;
ListOfAllMembersHandler* m_members;
};
void compoundhandler_init();
......
......@@ -1097,7 +1097,7 @@ void ImageHandler::endImage()
DotFileHandler::DotFileHandler(IBaseHandler *parent)
: m_parent(parent)
{
addEndHandler("image",this,&DotFileHandler::endDotFile);
addEndHandler("dotfile",this,&DotFileHandler::endDotFile);
}
DotFileHandler::~DotFileHandler()
......@@ -1327,6 +1327,32 @@ IDocIterator *PreformattedHandler::contents() const
return new PreformattedIterator(*this);
}
//----------------------------------------------------------------------
// VerbatimHandler
//----------------------------------------------------------------------
VerbatimHandler::VerbatimHandler(IBaseHandler *parent)
: m_parent(parent)
{
addEndHandler("verbatim",this,&VerbatimHandler::endVerbatim);
}
VerbatimHandler::~VerbatimHandler()
{
}
void VerbatimHandler::startVerbatim(const QXmlAttributes&)
{
m_parent->setDelegate(this);
m_curString="";
}
void VerbatimHandler::endVerbatim()
{
m_text = m_curString;
m_parent->setDelegate(0);
}
//----------------------------------------------------------------------
// SymbolHandler
//----------------------------------------------------------------------
......@@ -1393,6 +1419,7 @@ ParagraphHandler::ParagraphHandler(IBaseHandler *parent)
addStartHandler("indexentry",this,&ParagraphHandler::startIndexEntry);
addStartHandler("table",this,&ParagraphHandler::startTable);
addStartHandler("preformatted",this,&ParagraphHandler::startPreformatted);
addStartHandler("verbatim",this,&ParagraphHandler::startVerbatim);
addStartHandler("umlaut",this,&ParagraphHandler::startUmlaut);
addStartHandler("acute",this,&ParagraphHandler::startAcute);
addStartHandler("grave",this,&ParagraphHandler::startGrave);
......@@ -1567,6 +1594,14 @@ void ParagraphHandler::startPreformatted(const QXmlAttributes& attrib)
m_children.append(ph);
}
void ParagraphHandler::startVerbatim(const QXmlAttributes& attrib)
{
addTextNode();
VerbatimHandler *vh = new VerbatimHandler(this);
vh->startVerbatim(attrib);
m_children.append(vh);
}
void ParagraphHandler::startUmlaut(const QXmlAttributes& attrib)
{
addTextNode();
......
......@@ -65,6 +65,7 @@ DEFINE_CLS_IMPL(DocRow);
DEFINE_CLS_IMPL(DocEntry);
DEFINE_CLS_IMPL(DocSection);
DEFINE_CLS_IMPL(DocPreformatted);
DEFINE_CLS_IMPL(DocVerbatim);
DEFINE_CLS_IMPL(DocSymbol);
DEFINE_CLS_IMPL(DocRoot);
......@@ -190,6 +191,7 @@ class ParagraphHandler : public DocParaImpl,
virtual void startIndexEntry(const QXmlAttributes& attrib);
virtual void startTable(const QXmlAttributes& attrib);
virtual void startPreformatted(const QXmlAttributes& attrib);
virtual void startVerbatim(const QXmlAttributes& attrib);
virtual void startUmlaut(const QXmlAttributes& attrib);
virtual void startAcute(const QXmlAttributes& attrib);
virtual void startGrave(const QXmlAttributes& attrib);
......@@ -1017,6 +1019,30 @@ class PreformattedIterator :
BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
};
//-----------------------------------------------------------------------------
/*! \brief Node representing an preformatted section
*/
class VerbatimHandler : public DocVerbatimImpl,
public BaseHandler<VerbatimHandler>
{
friend class VerbatimIterator;
public:
VerbatimHandler(IBaseHandler *parent);
virtual ~VerbatimHandler();
void startVerbatim(const QXmlAttributes& attrib);
void endVerbatim();
// IDocVerbatim
virtual Kind kind() const { return DocImpl::Verbatim; }
virtual const IString *text() const { return &m_text; }
private:
IBaseHandler *m_parent;
StringImpl m_text;
};
//-----------------------------------------------------------------------------
/*! \brief Node representing an special symbol.
......
......@@ -16,7 +16,16 @@
#ifndef _DOXMLINTF_H
#define _DOXMLINTF_H
#include <qstring.h>
/*! \file
* \brief The interface to the object model provided by the XML parser
* library.
*
* To start using this library one calls createObjectModel and then
* uses the returned IDoxygen interface to read doxygen generated
* XML output and navigate through the information contained in it.
*
* @see createObjectModel()
*/
class IMember;
class IDocIterator;
......@@ -24,12 +33,20 @@ class ICompound;
class ISection;
class INode;
/*! \brief Read only interface to a string.
*/
class IString
{
public:
/*! Returns a latin1 character representation of the string. */
virtual const char *latin1() const = 0;
/*! Returns a 16-bit unicode character representation of the character at
* position \a index in the string. The first character is at index 0.
*/
virtual unsigned short unicodeCharAt(int index) const = 0;
/*! Returns true if this string is empty or false otherwise */
virtual bool isEmpty() const = 0;
/*! Returns the number of characters in the string. */
virtual int length() const = 0;
};
......@@ -107,24 +124,6 @@ class IMemberReferenceIterator
virtual void release() = 0;
};
class IEnumValue
{
public:
virtual const IString * name() const = 0;
virtual const IString * initializer() const = 0;
};
class IEnumValueIterator
{
public:
virtual IEnumValue *toFirst() = 0;
virtual IEnumValue *toLast() = 0;
virtual IEnumValue *toNext() = 0;
virtual IEnumValue *toPrev() = 0;
virtual IEnumValue *current() const = 0;
virtual void release() = 0;
};
class IDoc
{
public:
......@@ -161,8 +160,9 @@ class IDoc
Entry, // 28 -> IDocEntry
Section, // 29 -> IDocSection
Preformatted, // 30 -> IDocPreformatted
Symbol, // 31 -> IDocSymbol
Root // 32 -> IDocRoot
Verbatim, // 31 -> IDocVerbatim
Symbol, // 32 -> IDocSymbol
Root // 33 -> IDocRoot
};
virtual Kind kind() const = 0;
};
......@@ -399,6 +399,12 @@ class IDocPreformatted : public IDoc
virtual IDocIterator *contents() const = 0;
};
class IDocVerbatim : public IDoc
{
public:
virtual const IString *text() const = 0;
};
class IDocSymbol : public IDoc
{
public:
......@@ -499,7 +505,8 @@ class IMember
public:
enum MemberKind { Invalid=0,
Define, Property, Variable, Typedef, Enum,
Function, Signal, Prototype, Friend, DCOP, Slot
Function, Signal, Prototype, Friend, DCOP, Slot,
EnumValue
};
virtual ICompound *compound() const = 0;
virtual ISection *section() const = 0;
......@@ -525,11 +532,80 @@ class IMember
virtual int definitionLine() const = 0;
virtual IMemberReference *reimplements() const = 0;
virtual IMemberReferenceIterator *reimplementedBy() const = 0;
virtual IEnumValueIterator *enumValues() const = 0;
virtual IDocRoot *briefDescription() const = 0;
virtual IDocRoot *detailedDescription() const = 0;
};
class IDefine : public IMember
{
public:
};
class IProperty : public IMember
{
public:
};
class IVariable : public IMember
{
public:
};
class ITypedef : public IMember
{
public:
};
class IFunction : public IMember
{
public:
};
class ISignal : public IMember
{
public:
};
class IPrototype : public IMember
{
public:
};
class IFriend : public IMember
{
public:
};
class IDCOP : public IMember
{
public:
};
class ISlot : public IMember
{
public:
};
class IEnumValue : public IMember
{
public:
virtual const IString * name() const = 0;
};
#if 0
class IEnumValueIterator
{
public:
virtual IEnumValue *toFirst() = 0;
virtual IEnumValue *toLast() = 0;
virtual IEnumValue *toNext() = 0;
virtual IEnumValue *toPrev() = 0;
virtual IEnumValue *current() const = 0;
virtual void release() = 0;
};
#endif
class IMemberIterator
{
public:
......@@ -541,6 +617,12 @@ class IMemberIterator
virtual void release() = 0;
};
class IEnum : public IMember
{
public:
virtual IMemberIterator *enumValues() const = 0;
};
/*! \brief The interface to a section in the object model.
*
* A compound can have a number of sections, where each
......
......@@ -4,12 +4,14 @@ HEADERS = basehandler.h mainhandler.h \
compoundhandler.h sectionhandler.h \
memberhandler.h paramhandler.h \
dochandler.h linkedtexthandler.h \
debug.h graphhandler.h stringimpl.h
debug.h graphhandler.h stringimpl.h \
loamhandler.h
SOURCES = mainhandler.cpp \
compoundhandler.cpp sectionhandler.cpp \
memberhandler.cpp paramhandler.cpp \
dochandler.cpp linkedtexthandler.cpp \
basehandler.cpp debug.cpp graphhandler.cpp
basehandler.cpp debug.cpp graphhandler.cpp \
loamhandler.cpp
unix:LIBS += -L../../../lib -lqtools
win32:INCLUDEPATH += .
win32-mingw:LIBS += -L../../../lib -lqtools
......
#include "loamhandler.h"
#include "memberhandler.h"
ListOfAllMembersHandler::ListOfAllMembersHandler(IBaseHandler *parent) : m_parent(parent)
{
m_members.setAutoDelete(TRUE);
addStartHandler("member",this,&ListOfAllMembersHandler::startMember);
addStartHandler("name",this,&ListOfAllMembersHandler::startName);
addEndHandler("name",this,&ListOfAllMembersHandler::endName);
addEndHandler("listofallmembers",this,&ListOfAllMembersHandler::endListOfAllMembers);
}
void ListOfAllMembersHandler::initialize(MainHandler *mh)
{
QListIterator<MemberReference> mli(m_members);
MemberReference *mr;
for (;(mr=mli.current());++mli)
{
mr->initialize(mh);
}
}
void ListOfAllMembersHandler::startMember(const QXmlAttributes& attrib)
{
MemberReference *mr = new MemberReference;
mr->m_memId = attrib.value("refid");
// TODO: extract prot, virt, ambiguityscope and scope as well
m_members.append(new MemberReference);
}
void ListOfAllMembersHandler::startName(const QXmlAttributes&)
{
m_curString="";
}
void ListOfAllMembersHandler::endName()
{
ASSERT(m_members.getLast());
m_members.getLast()->m_name = m_curString;
}
void ListOfAllMembersHandler::startListOfAllMembers(const QXmlAttributes& /*attrib*/)
{
m_parent->setDelegate(this);
debug(2,"listofallmembers start\n");
}
void ListOfAllMembersHandler::endListOfAllMembers()
{
m_parent->setDelegate(0);
debug(2,"listofallmembers end\n");
}
IMemberReferenceIterator *ListOfAllMembersHandler::members() const
{
return new MemberReferenceIterator(m_members);
}
/******************************************************************************
*
* $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.
*
*/
#ifndef _LOAMHANDLER_H
#define _LOAMHANDLER_H
#include <qstring.h>
#include <qlist.h>
#include <doxmlintf.h>
#include "basehandler.h"
class MainHandler;
class MemberReference;
class ListOfAllMembersHandler : public BaseHandler<ListOfAllMembersHandler>
{
public:
virtual void startMember(const QXmlAttributes& attrib);
virtual void startName(const QXmlAttributes& attrib);
virtual void endName();
virtual void startListOfAllMembers(const QXmlAttributes& attrib);
virtual void endListOfAllMembers();
ListOfAllMembersHandler(IBaseHandler *parent);
virtual ~ListOfAllMembersHandler() {}
void initialize(MainHandler *mh);
virtual IMemberReferenceIterator *members() const;
protected:
IBaseHandler *m_parent;
QList<MemberReference> m_members;
};
#endif
......@@ -39,6 +39,7 @@ class MemberTypeMap
m_map.insert("friend",new int(IMember::Friend));
m_map.insert("dcop",new int(IMember::DCOP));
m_map.insert("slot",new int(IMember::Slot));
m_map.insert("enumvalue",new int(IMember::EnumValue));
}
IMember::MemberKind map(const QString &s)
{
......@@ -82,19 +83,28 @@ IMember *MemberReference::member() const
//------------------------------------------------------------------------------
EnumValueHandler::EnumValueHandler(IBaseHandler *parent) : m_parent(parent), m_brief(0), m_detailed(0)
#if 0
EnumValueHandler::EnumValueHandler(IBaseHandler *parent) :
m_parent(parent), m_brief(0), m_detailed(0), m_linkedTextHandler(0)
{
addEndHandler("enumvalue",this,&EnumValueHandler::endEnumValue);
addStartHandler("name",this,&EnumValueHandler::startName);
addEndHandler("name",this,&EnumValueHandler::endName);
addStartHandler("initializer",this,&EnumValueHandler::startInitializer);
addEndHandler("initializer",this,&EnumValueHandler::endInitializer);
addStartHandler("briefdescription",this,&EnumValueHandler::startBriefDesc);
addStartHandler("detaileddescription",this,&EnumValueHandler::startDetailedDesc);
m_initializer.setAutoDelete(TRUE);
}
EnumValueHandler::~EnumValueHandler()
{
delete m_brief;
delete m_detailed;
delete m_linkedTextHandler;
}
void EnumValueHandler::startEnumValue(const QXmlAttributes& /*attrib*/)
......@@ -119,12 +129,9 @@ void EnumValueHandler::endName()
void EnumValueHandler::startInitializer(const QXmlAttributes& /*attrib*/)
{
m_curString="";
}
void EnumValueHandler::endInitializer()
{
m_initializer = m_curString;
delete m_linkedTextHandler;
m_linkedTextHandler = new LinkedTextHandler(this,m_initializer);
m_linkedTextHandler->start("initializer");
}
void EnumValueHandler::startBriefDesc(const QXmlAttributes& attrib)
......@@ -140,7 +147,7 @@ void EnumValueHandler::startDetailedDesc(const QXmlAttributes& attrib)
docHandler->startDoc(attrib);
m_detailed = docHandler;
}
#endif
//------------------------------------------------------------------------------
......@@ -149,13 +156,14 @@ MemberHandler::MemberHandler(IBaseHandler *parent)
{
//printf("MemberHandler::MemberHandler() %p\n",this);
addEndHandler("memberdef",this,&MemberHandler::endMember);
addEndHandler("enumvalue",this,&MemberHandler::endMember);
addStartHandler("type",this,&MemberHandler::startType);
addStartHandler("initializer",this,&MemberHandler::startInitializer);
addStartHandler("exception",this,&MemberHandler::startException);
addStartHandler("enumvalue",this,&MemberHandler::startEnumValue);
addStartHandler("enumvalue",this,&MemberHandler::startEnumValue2);
addStartHandler("name");
addStartHandler("name",this,&MemberHandler::startName);
addEndHandler("name",this,&MemberHandler::endName);
addStartHandler("param",this,&MemberHandler::startParam);
......@@ -212,6 +220,7 @@ void MemberHandler::startMember(const QXmlAttributes& attrib)
{
m_parent->setDelegate(this);
m_kindString = attrib.value("kind");
printf("startMember kindString=`%s'\n",m_kindString.data());
m_kind = s_typeMap->map(m_kindString);
m_id = attrib.value("id");
m_virtualness = attrib.value("virt");
......@@ -222,6 +231,29 @@ void MemberHandler::startMember(const QXmlAttributes& attrib)
m_kindString.data(),m_id.data(),m_protection.data(),m_virtualness.data());
}
void MemberHandler::startEnumValue(const QXmlAttributes& attrib)
{
m_parent->setDelegate(this);
m_kindString = "enumvalue";
printf("startEnumValue kindString=`%s'\n",m_kindString.data());
m_kind = s_typeMap->map(m_kindString);
m_id = attrib.value("id");
m_virtualness = "non-virtual";
m_protection = attrib.value("prot");
m_isConst = FALSE;
m_isVolatile = FALSE;
debug(2,"member kind=`%s' id=`%s' prot=`%s' virt=`%s'\n",
m_kindString.data(),m_id.data(),m_protection.data(),m_virtualness.data());
}
void MemberHandler::startEnumValue2(const QXmlAttributes& attrib)
{
MemberHandler *mh = new MemberHandler(this);
mh->startEnumValue(attrib);
m_enumValues.append(mh);
}
void MemberHandler::startBriefDesc(const QXmlAttributes& attrib)
{
DocHandler *docHandler = new DocHandler(this);
......@@ -328,6 +360,11 @@ void MemberHandler::startException(const QXmlAttributes &)
m_linkedTextHandler->start("exception");
}
void MemberHandler::startName(const QXmlAttributes &)
{
m_curString="";
}
void MemberHandler::endName()
{
m_name = m_curString.stripWhiteSpace();
......@@ -348,13 +385,6 @@ void MemberHandler::startParam(const QXmlAttributes& attrib)
}
}
void MemberHandler::startEnumValue(const QXmlAttributes& attrib)
{
EnumValueHandler *evh = new EnumValueHandler(this);
evh->startEnumValue(attrib);
m_enumValues.append(evh);
}
void MemberHandler::startTemplateParamList(const QXmlAttributes&)
{
m_insideTemplateParamList = TRUE;
......@@ -416,4 +446,9 @@ ISection *MemberHandler::section() const
return m_section;
}
IMemberIterator *MemberHandler::enumValues() const
{
return new MemberIterator(m_enumValues);
}
......@@ -51,6 +51,8 @@ class MemberReferenceIterator : public BaseIterator<IMemberReferenceIterator,IMe
BaseIterator<IMemberReferenceIterator,IMemberReference,MemberReference>(list) {}
};
#if 0
class EnumValueHandler : public IEnumValue, public BaseHandler<EnumValueHandler>
{
public:
......@@ -65,12 +67,12 @@ class EnumValueHandler : public IEnumValue, public BaseHandler<EnumValueHandler>
// IEnumValue
virtual const IString *name() const { return &m_name; }
virtual const IString *initializer() const { return &m_initializer; }
virtual ILinkedTextIterator *initializer() const
{ return new LinkedTextIterator(m_initializer); }
void setName(const QString &name) { m_name=name; }
void setInitializer(const QString &init) { m_initializer=init; }
virtual ~EnumValueHandler() { delete m_brief; delete m_detailed; }
virtual ~EnumValueHandler();
EnumValueHandler(IBaseHandler *parent);
virtual IDocRoot *briefDescription() const
......@@ -80,10 +82,11 @@ class EnumValueHandler : public IEnumValue, public BaseHandler<EnumValueHandler>
private:
StringImpl m_name;
StringImpl m_initializer;
QList<LinkedTextImpl> m_initializer;
IBaseHandler *m_parent;
DocHandler *m_brief;
DocHandler *m_detailed;
LinkedTextHandler *m_linkedTextHandler;
};
class EnumValueIterator : public BaseIterator<IEnumValueIterator,IEnumValue,EnumValueHandler>
......@@ -92,15 +95,29 @@ class EnumValueIterator : public BaseIterator<IEnumValueIterator,IEnumValue,Enum
EnumValueIterator(const QList<EnumValueHandler> &list) :
BaseIterator<IEnumValueIterator,IEnumValue,EnumValueHandler>(list) {}
};
#endif
class MemberHandler : public IMember, public BaseHandler<MemberHandler>
class MemberHandler : public IDefine,
public IProperty,
public IVariable,
public ITypedef,
public IFunction,
public ISignal,
public IPrototype,
public IFriend,
public IDCOP,
public ISlot,
public IEnum,
public IEnumValue,
public BaseHandler<MemberHandler>
{
public:
virtual void startMember(const QXmlAttributes& attrib);
virtual void endMember();
virtual void startParam(const QXmlAttributes& attrib);
virtual void startType(const QXmlAttributes& attrib);
virtual void startName(const QXmlAttributes& attrib);
virtual void endName();
virtual void startBriefDesc(const QXmlAttributes& attrib);
virtual void startDetailedDesc(const QXmlAttributes& attrib);
......@@ -116,6 +133,7 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler>
virtual void startInitializer(const QXmlAttributes& attrib);
virtual void startException(const QXmlAttributes& attrib);
virtual void startEnumValue(const QXmlAttributes& attrib);
virtual void startEnumValue2(const QXmlAttributes& attrib);
virtual void startTemplateParamList(const QXmlAttributes &attrib);
virtual void endTemplateParamList();
......@@ -172,13 +190,14 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler>
{ return m_reimplements; }
virtual IMemberReferenceIterator *reimplementedBy() const
{ return new MemberReferenceIterator(m_reimplementedBy); }
virtual IEnumValueIterator *enumValues() const
{ return new EnumValueIterator(m_enumValues); }
virtual IDocRoot *briefDescription() const
{ return m_brief; }
virtual IDocRoot *detailedDescription() const
{ return m_detailed; }
// IEnum
virtual IMemberIterator *enumValues() const;
void initialize(MainHandler *m);
void setCompoundHandler(CompoundHandler *c);
void setSectionHandler(SectionHandler *s);
......@@ -212,16 +231,19 @@ class MemberHandler : public IMember, public BaseHandler<MemberHandler>
bool m_isConst;
bool m_isVolatile;
LinkedTextHandler *m_linkedTextHandler;
QList<EnumValueHandler> m_enumValues;
QList<MemberHandler> m_enumValues;
bool m_insideTemplateParamList;
bool m_hasTemplateParamList;
};
class MemberIterator : public BaseIterator<IMemberIterator,IMember,MemberHandler>
class MemberIterator : public BaseIteratorVia<IMemberIterator,
IMember,
MemberHandler,
IFunction>
{
public:
MemberIterator(const QList<MemberHandler> &list) :
BaseIterator<IMemberIterator,IMember,MemberHandler>(list) {}
BaseIteratorVia<IMemberIterator,IMember,MemberHandler,IFunction>(list) {}
};
void memberhandler_init();
......
......@@ -20,10 +20,8 @@
TemplateParamListHandler::TemplateParamListHandler(IBaseHandler *parent) : m_parent(parent)
{
addStartHandler("param",this,&TemplateParamListHandler::startParam);
//addEndHandler("param",this,&TemplateParamListHandler::endParam);
addEndHandler("templateparamlist",this,&TemplateParamListHandler::endTemplateParamList);
}
void TemplateParamListHandler::startParam(const QXmlAttributes& attrib)
......
......@@ -16,6 +16,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <doxmlintf.h>
#include <qstring.h>
/*! Dumps the contents of a hyperlinked text fragment as plain text to the
* output.
......@@ -390,6 +391,15 @@ void DumpDoc(IDoc *doc,int level)
InPrint(("<preformatted/>\n"));
}
break;
case IDoc::Verbatim:
{
InPrint(("<verbatim>\n"));
IDocVerbatim *vt = dynamic_cast<IDocVerbatim*>(doc);
ASSERT(vt!=0);
InPrint(("%s",vt->text()->latin1()));
InPrint(("<verbatim/>\n"));
}
break;
case IDoc::Symbol:
{
IDocSymbol *sym = dynamic_cast<IDocSymbol*>(doc);
......@@ -540,14 +550,22 @@ int main(int argc,char **argv)
}
mri->release();
IEnumValueIterator *evi = mem->enumValues();
IEnumValue *ev;
for (evi->toFirst();(ev=evi->current());evi->toNext())
if (mem->kind()==IMember::Enum) // we have found an enum
{
printf(" Enum value `%s' init=`%s'\n",
ev->name()->latin1(),ev->initializer()->latin1());
IEnum *e = dynamic_cast<IEnum*>(mem);
IMemberIterator *evi = e->enumValues(); // get the enum values
IMember *mev;
for (evi->toFirst();(mev=evi->current());evi->toNext())
{
IEnumValue *ev = dynamic_cast<IEnumValue*>(mev);
ILinkedTextIterator *lti = ev->initializer();
QString init = linkedTextToString(lti);
lti->release();
printf(" Enum value `%s' init=`%s'\n",
ev->name()->latin1(),init.latin1());
}
evi->release();
}
evi->release();
pli = mem->templateParameters();
if (pli)
......
sub section($$) {
my ($wrap, $name) = @_;
my $prefix = "Doxy" . $name;
return
[ "hash", "Doxy" . $wrap,
{
members =>
[ "list", $prefix . "s",
[ "hash", $prefix,
{
kind => [ "field", $prefix . "Kind" ],
name => [ "field", $prefix . "Name" ],
virtualness => [ "field", $prefix . "Virtualness" ],
protection => [ "field", $prefix . "Protection" ],
type => [ "field", $prefix . "Type" ],
parameters =>
[ "list", $prefix . "Params",
[ "hash", $prefix . "Param",
{
declaration_name => [ "field", $prefix . "ParamName" ],
type => [ "field", $prefix . "ParamType" ],
},
],
],
detailed =>
[ "hash", $prefix . "Detailed",
{
doc => [ "doc", $prefix . "DetailedDoc" ],
return => [ "doc", $prefix . "Return" ],
see => [ "doc", $prefix . "See" ],
params =>
[ "list", $prefix . "PDBlocks",
[ "hash", $prefix . "PDBlock",
{
parameters =>
[ "list", $prefix . "PDParams",
[ "hash", $prefix . "PDParam",
{
name => [ "field", $prefix . "PDParamName" ],
},
],
],
doc => [ "doc", $prefix . "PDDoc" ],
},
],
],
},
],
},
],
],
},
];
}
$doxymodel =
[ "hash", "DoxyTop",
{
files =>
[ "list", "DoxyFiles",
[ "hash", "DoxyFile",
{
name => [ "field", "DoxyFileName" ],
typedefs => section("FileTypedefs", "Typedef"),
variables => section("FileVariables", "Variable"),
functions => section("FileFunctions", "Function"),
detailed =>
[ "hash", "DoxyFileDetailed",
{
doc => [ "doc", "DoxyFileDetailedDoc" ],
},
],
},
],
],
classes =>
[ "list", "DoxyClasses",
[ "hash", "DoxyClass",
{
name => [ "field", "DoxyClassName" ],
public_typedefs => section("ClassPublicTypedefs", "Typedef"),
public_methods => section("ClassPublicMethods", "Function"),
public_members => section("ClassPublicMembers", "Variable"),
protected_typedefs => section("ClassProtectedTypedefs", "Typedef"),
protected_methods => section("ClassProtectedMethods", "Function"),
protected_members => section("ClassProtectedMembers", "Variable"),
private_typedefs => section("ClassPrivateTypedefs", "Typedef"),
private_methods => section("ClassPrivateMethods", "Function"),
private_members => section("ClassPrivateMembers", "Variable"),
detailed =>
[ "hash", "DoxyClassDetailed",
{
doc => [ "doc", "DoxyClassDetailedDoc" ],
},
],
},
],
],
},
];
1;
DoxyModel.pm: it is a Perl module with information about the structure
of DoxyDocs.pm files. It is used by Perl scripts that process the
output generated by the Perl backend.
doxydocs-latex.pl: it is a Perl script which uses DoxyModel.pm and a
generated DoxyDocs.pm to create the file doxydocs.tex. This file
contains the documentation, this time in "TeX" format. doxydocs.tex,
however, can't been directly LaTeX'ed.
doxydocs-latex.ltx: this is the LaTeX file which is LaTeX'ed to
generate the PDF or DVI documentation. It includes doxydocs.tex,
generated by doxydocs-latex.pl above, and doxytemplate.tex, generated
by doxytemplate-latex.pl -- see below. This file is intended to be
customized by users if they want to modify the format of the PDF or
DVI output.
doxytemplate-latex.pl: this is a Perl script which uses DoxyModel.pm
to generate a doxytemplate.tex TeX file. This file is included by
doxydocs-latex.ltx to maintain the compatibility with future versions
of Doxygen; i.e. a customized doxydocs-latex.ltx should work with the
output generated by future versions of Doxygen as long as it includes
an updated doxydocs.tex.
So what do you do to test my backend?
1. You apply perlgen.diff and rebuild Doxygen.
2. You save DoxyModel.pm, doxydocs-latex.pl, doxytemplate-latex.pl and
doxydocs-latex.ltx to your test directory.
3. You run doxytemplate-latex.pl to generate doxytemplate.tex.
4. You generate DoxyDocs.pm by running Doxygen on the test code. (You
must enable the GENERATE_PERL option in your Doxyfile).
5. You run doxydocs-latex.pl to generate doxydocs.tex from
DoxyDocs.pm.
6. You run pdflatex on doxydocs-latex.ltx to generate
doxydocs-latex.pdf from doxydocs.tex and doxytemplate.tex.
If you want to regenerate the PDF output after modifying the test code
you only need to do the steps from 4 on.
I also attach a main.h file I've used to test my backend and the
corresponding main.pdf file I've generated from it.
#!/usr/bin/perl
# Copyright (C) 1997-2002 by Dimitri van Heesch.
# Author: Miguel Lobo.
#
# 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.
#
# Documents produced by Doxygen are derivative works derived from the
# input used in their production; they are not affected by this license.
# This script can be used to generate LaTeX output using the new Perl
# intermediate format. It is incomplete and experimental, so for the moment
# you should use Doxygen"s standard LaTeX output.
#
# If you want to try this out, you should do:
# doxygen configName # This creates DoxyDocs.pm
# perl -I. doxydocs-latex.pl # This creates doxydocs.tex and doxytemplate.tex
# latex doxydocs-latex.ltx # This creates doxydocs-latex.dvi
#
# Notes:
# - Your config file has to have Perl output enabled, of course.
# - The Perl output format is only complete enough to document
# a simple C file; no classes by the moment :-).
use DoxyModel;
use DoxyDocs;
sub latex_quote($) {
my $text = $_[0];
$text =~ s/[\\_&]/\\$&/g;
print TEXDOCS $text;
}
sub generate_doc($) {
my $doc = $_[0];
for my $item (@$doc) {
my $type = $$item{type};
if ($type eq "text") {
latex_quote($$item{content});
} elsif ($type eq "para") {
generate_doc($$item{content});
# print TEXDOCS "\\par\n";
} elsif ($type eq "bold") {
print TEXDOCS "\\textbf{";
generate_doc($$item{content});
print TEXDOCS "}";
} elsif ($type eq "emphasis") {
print TEXDOCS "\\textit{";
generate_doc($$item{content});
print TEXDOCS "}";
} elsif ($type eq "url") {
latex_quote($$item{content});
}
}
}
sub generate($$) {
my ($item, $model) = @_;
my ($type, $name) = @$model[0, 1];
if ($type eq "field") {
print TEXDOCS "\\" . $name . "{";
latex_quote($item);
print TEXDOCS "}";
} elsif ($type eq "doc") {
if (@$item) {
print TEXDOCS "\\" . $name . "{";
generate_doc($item);
print TEXDOCS "}%\n";
} else {
print TEXDOCS "\\" . $name . "Empty%\n";
}
} elsif ($type eq "hash") {
my ($key, $value);
while (($key, $submodel) = each %{$$model[2]}) {
my $name = $$submodel[1];
print TEXDOCS "\\def\\f" . $name . "{";
if ($$item{$key}) {
generate($$item{$key}, $submodel);
} else {
print TEXDOCS "\\" . $name . "Empty";
}
print TEXDOCS "}%\n";
}
print TEXDOCS "\\" . $name . "%\n";
} elsif ($type eq "list") {
my $index = 0;
if (@$item) {
print TEXDOCS "\\" . $name . "{%\n";
for my $subitem (@$item) {
if ($index) {
print TEXDOCS "\\" . $name . "Sep%\n";
}
generate($subitem, $$model[2]);
$index++;
}
print TEXDOCS "}%\n";
} else {
print TEXDOCS "\\" . $name . "Empty%\n";
}
}
}
open TEXDOCS, ">doxydocs.tex";
generate($doxydocs, $doxymodel);
close TEXDOCS;
use DoxyModel;
sub template($) {
my $model = $_[0];
my ($type, $name) = @$model[0, 1];
if ($type eq "field") {
print TEXTEMPLATE "\\def\\" . $name . "#1{#1}%\n";
} elsif ($type eq "doc") {
print TEXTEMPLATE "\\def\\" . $name . "#1{#1}%\n";
} elsif ($type eq "hash") {
my ($key, $value);
while (($key, $submodel) = each %{$$model[2]}) {
my $subname = $$submodel[1];
print TEXTEMPLATE "\\def\\" . $subname . "Empty{}%\n";
print TEXTEMPLATE "\\def\\f" . $subname . "Empty{\\" . $subname . "Empty}%\n";
template($submodel);
}
print TEXTEMPLATE "\\def\\" . $name . "{}%\n";
} elsif ($type eq "list") {
template($$model[2]);
print TEXTEMPLATE "\\def\\" . $name . "#1{#1}%\n";
print TEXTEMPLATE "\\def\\" . $name . "Sep{}%\n";
}
}
open TEXTEMPLATE, ">doxytemplate.tex";
template($doxymodel);
close TEXTEMPLATE;
......@@ -36,7 +36,8 @@ INPUT = index.doc install.doc starting.doc docblocks.doc lists.doc \
doxygen_usage.doc doxytag_usage.doc doxysearch_usage.doc \
doxywizard_usage.doc \
installdox_usage.doc output.doc autolink.doc \
config.doc commands.doc htmlcmds.doc language.doc arch.doc
config.doc commands.doc htmlcmds.doc language.doc \
perlmod.doc perlmod_tree.doc arch.doc
FILE_PATTERNS = *.cpp *.h *.doc
EXAMPLE_PATH = ../examples
RECURSIVE = NO
......
......@@ -72,6 +72,8 @@ Written by Dimitri van Heesch\\[2ex]
\input{htmlcmds}
\part{Developers Manual}
\input{arch}
\input{perlmod}
%\input{perlmod_tree}
\input{langhowto}
\printindex
\end{document}
......@@ -62,7 +62,7 @@ PREDEFINED = MY_MACRO()=
manual for more information.
</ol>
<li><b>When I set EXTRACT_ALL to NO non of my functions are shown in the documentation.</b></li>
<li><b>When I set EXTRACT_ALL to NO none of my functions are shown in the documentation.</b></li>
In order for global functions, variables, enums, typedefs, and defines
to be documented you should document the file in which these commands are
......@@ -111,9 +111,9 @@ in the documentation of the class MyClassName regardless of the name of the actu
header file in which the definition of MyClassName is contained.
If you want doxygen to show that the include file should be included using
brackets you should type:
quotes instead of angle brackets you should type:
\verbatim
/*! \class MyClassName include.h "path/include.h"
/*! \class MyClassName myhdr.h "path/myhdr.h"
*
* Docs for MyClassName
*/
......@@ -187,18 +187,36 @@ EXCLUDE_PATTERNS = */test/*
Put a \% in front of the class name. Like this: \%MyClass. Doxygen will then
remove the % and keep the word unlinked.
<li><b>My favourite programming language is X. Can I still use doxygen?</b>
No, not as such; doxygen needs to understand the structure of what it reads.
If you don't mind spending some time on it, there are several options:
- If the grammer of X is close to C or C++, then it is probably not too hard to
tweak src/scanner.l a bit so the language is supported. This is done
for all other languages directly supported by doxygen
(i.e. Java, IDL, C#, PHP).
- If the grammer of X is somewhat different than you can write an input
filter that translates X into something similar enough to C/C++ for
doxygen to understand (this approach is taken for VB, Object Pascal, and
Javascript, see http://www.stack.nl/~dimitri/doxygen/download.html#helpers).
- If the grammer is completely different one could write a parser for X and
write a backend that produces a similar syntax tree as is done by
src/scanner.l (and also by src/tagreader.cpp while reading tag files).
<li><b>Help! I get the cryptic message
"input buffer overflow, can't enlarge buffer because scanner uses REJECT"</b>
This error happens when doxygen lexical scanner has a rules that matches
more than 16K input character in one go. I've seen this happening
This error happens when doxygen lexical scanner has a rule that matches
more than 16K of input characters in one go. I've seen this happening
on a very large generated file (\>16K lines), where the built-in preprocessor
converted it into an empty file (with \>16K of newlines). Another case
where this might happen is if you have lines in your code with more than
16K characters.
If you have ran into such a case and want me to fix it, you
should send me a code fragment that triggers the message.
If you have run into such a case and want me to fix it, you
should send me a code fragment that triggers the message. The workaround
the problem put some line-breaks into your file, split it up into smaller
parts, or exclude it from the input using EXCLUDE.
<li><b>How did doxygen get its name?</b>
......@@ -211,7 +229,7 @@ generator -> gen
\endverbatim
At the time I was looking into lex and yacc, where a lot of things start with
"yy", so the "y" slipped in and made things pronouncable.
"yy", so the "y" slipped in and made things pronounceable.
<li><b>What was the reason to develop doxygen?</b>
......
......@@ -27,7 +27,7 @@ Version: $(VERSION)
<h2>Introduction</h2>
Doxygen is a documentation system for C++, C, Java, IDL
(Corba, Microsoft, and KDE-DCOP flavors) and to some extent PHP.
(Corba, Microsoft, and KDE-DCOP flavors) and to some extent PHP and C#.
It can help you in three ways:
<ol>
......@@ -105,6 +105,7 @@ The third part provides information for developers:
<ul>
<li>Section \ref arch gives a global overview of how doxygen is internally
structured.
<li>Section \ref perlmod shows how to use the PerlMod output.
<li>Section \ref langhowto explains how to add support for new
output languages.
</ul>
......
......@@ -557,15 +557,15 @@ http://www.trolltech.com/products/download/qt-win-noncomm.html
Doxygen was developed and tested under Linux using the following
open-source tools:
<ul>
<li>EGCS version 2.91.66
<li>GCC version 2.95.3
<li>GNU flex version 2.5.4
<li>GNU bison version 1.25
<li>GNU make version 3.76.1
<li>Perl version 5.005_02
<li>VIM version 5.4
<li>Netscape 4.61
<li>GNU bison version 1.35
<li>GNU make version 3.79.1
<li>Perl version 5.005_03
<li>VIM version 5.8
<li>Mozilla 1.0
<li>Troll Tech's tmake version 1.3 (included in the distribution)
<li>teTeX version 0.9
<li>teTeX version 1.0
<li>CVS 1.10.7
</ul>
......
......@@ -25,7 +25,7 @@ Doxygen has built-in support for multiple languages. This means
that the text fragments that doxygen generates can be produced in
languages other than English (the default) at configuration time.
Currently (version 1.2.14-20020317), 28 languages
Currently (version 1.2.18-20021020), 28 languages
are supported (sorted alphabetically):
Brazilian Portuguese, Catalan, Chinese, Chinese Traditional, Croatian,
Czech, Danish, Dutch, English, Finnish,
......@@ -79,7 +79,7 @@ when the translator was updated.
<TD>Croatian</TD>
<TD>Boris Bralo</TD>
<TD>boris.bralo@NOSPAM.zg.tel.hr</TD>
<TD>up-to-date</TD>
<TD>1.2.18</TD>
</TR>
<TR BGCOLOR="#ffffff">
<TD>Czech</TD>
......@@ -139,13 +139,13 @@ when the translator was updated.
<TD>Italian</TD>
<TD>Alessandro Falappa<br>Ahmed Aldo Faisal</TD>
<TD>alessandro@NOSPAM.falappa.net<br>aaf23@NOSPAM.cam.ac.uk</TD>
<TD>up-to-date</TD>
<TD>1.2.18</TD>
</TR>
<TR BGCOLOR="#ffffff">
<TD>Japanese</TD>
<TD>Ryunosuke Sato<br>Kenji Nagamatsu</TD>
<TD>puyo@NOSPAM.mint.freemail.ne.jp<br>naga@NOSPAM.joyful.club.ne.jp</TD>
<TD>up-to-date</TD>
<TD>1.2.18</TD>
</TR>
<TR BGCOLOR="#ffffff">
<TD>Korean</TD>
......@@ -169,7 +169,7 @@ when the translator was updated.
<TD>Portuguese</TD>
<TD>Rui Godinho Lopes</TD>
<TD>ruiglopes@NOSPAM.yahoo.com</TD>
<TD>up-to-date</TD>
<TD>1.2.18</TD>
</TR>
<TR BGCOLOR="#ffffff">
<TD>Romanian</TD>
......@@ -193,7 +193,7 @@ when the translator was updated.
<TD>Slovak</TD>
<TD>Stanislav Kudl&aacute;&#x010d;</TD>
<TD>skudlac@NOSPAM.pobox.sk</TD>
<TD>up-to-date</TD>
<TD>1.2.18</TD>
</TR>
<TR BGCOLOR="#ffffff">
<TD>Slovene</TD>
......@@ -239,7 +239,7 @@ when the translator was updated.
\hline
Chinese Traditional & Gary Lee & {\tt garylee@ecosine.com.tw} & 1.2.16 \\
\hline
Croatian & Boris Bralo & {\tt boris.bralo@zg.tel.hr} & up-to-date \\
Croatian & Boris Bralo & {\tt boris.bralo@zg.tel.hr} & 1.2.18 \\
\hline
Czech & Petr P\v{r}ikryl & {\tt prikrylp@skil.cz} & up-to-date \\
\hline
......@@ -260,10 +260,10 @@ when the translator was updated.
\hline
Hungarian & F\"{o}ldv\'{a}ri Gy\"{o}rgy & {\tt foldvari@diatronltd.com} & 1.2.1 \\
\hline
Italian & Alessandro Falappa & {\tt alessandro@falappa.net} & up-to-date \\
Italian & Alessandro Falappa & {\tt alessandro@falappa.net} & 1.2.18 \\
& Ahmed Aldo Faisal & {\tt aaf23@cam.ac.uk} & \\
\hline
Japanese & Ryunosuke Sato & {\tt puyo@mint.freemail.ne.jp} & up-to-date \\
Japanese & Ryunosuke Sato & {\tt puyo@mint.freemail.ne.jp} & 1.2.18 \\
& Kenji Nagamatsu & {\tt naga@joyful.club.ne.jp} & \\
\hline
Korean & Richard Kim & {\tt ryk@dspwiz.com} & 1.2.13 \\
......@@ -273,7 +273,7 @@ when the translator was updated.
Polish & Piotr Kaminski & {\tt Piotr.Kaminski@ctm.gdynia.pl} & 1.2.17 \\
& Grzegorz Kowal & {\tt g\_kowal@poczta.onet.pl} & \\
\hline
Portuguese & Rui Godinho Lopes & {\tt ruiglopes@yahoo.com} & up-to-date \\
Portuguese & Rui Godinho Lopes & {\tt ruiglopes@yahoo.com} & 1.2.18 \\
\hline
Romanian & Alexandru Iosup & {\tt aiosup@yahoo.com} & 1.2.16 \\
\hline
......@@ -281,7 +281,7 @@ when the translator was updated.
\hline
Serbian & Dejan Milosavljevic & {\tt dmilos@email.com} & 1.2.17 \\
\hline
Slovak & Stanislav Kudl\'{a}\v{c} & {\tt skudlac@pobox.sk} & up-to-date \\
Slovak & Stanislav Kudl\'{a}\v{c} & {\tt skudlac@pobox.sk} & 1.2.18 \\
\hline
Slovene & Matjaz Ostroversnik & {\tt matjaz.ostroversnik@zrs-tk.si} & 1.2.16 \\
\hline
......
/*! \page perlmod Perl Module output format documentation
\addindex perlmod
<p>Since version 1.2.18, Doxygen can generate a new output format we
have called the &quot;Perl Module output format&quot;. It has been
designed as an intermediate format that can be used to generate new
and customized output without having to modify the Doxygen source.
Therefore, its purpose is similar to the XML output format that can be
also generated by Doxygen. The XML output format is more standard,
but the Perl Module output format is possibly simpler and easier to
use.
<p>The Perl Module output format is still experimental at the moment
and could be changed in incompatible ways in future versions, although
this should not be very probable. It is also lacking some features of
other Doxygen backends. However, it can be already used to generate
useful output, as shown by the Perl Module-based LaTeX generator.
<p>Please report any bugs or problems you find in the Perl Module
backend or the Perl Module-based LaTeX generator to the
doxygen-develop mailing list. Suggestions are welcome as well.
\section using_perlmod_fmt Using the Perl Module output format.
<p>When the <b>GENERATE_PERLMOD</b> tag is enabled in the Doxyfile,
running Doxygen generates a number of files in the <b>perlmod/</b>
subdirectory of your output directory. These files are the following:
<ul>
<li><b>DoxyDocs.pm</b>. This is the Perl module that actually
contains the documentation, in the Perl Module format described
\ref doxydocs_format "below".
<li><b>DoxyModel.pm</b>. This Perl module describes the structure of
<b>DoxyDocs.pm</b>, independently of the actual documentation. See
\ref doxymodel_format "below" for details.
<li><b>doxyrules.make</b>. This file contains the make rules to build
and clean the files that are generated from the Doxyfile. Also
contains the paths to those files and other relevant information. This
file is intended to be included by your own Makefile.
<li><b>Makefile</b>. This is a simple Makefile including
<b>doxyrules.make</b>.
</ul>
<p>To make use of the documentation stored in DoxyDocs.pm you can use
one of the default Perl Module-based generators provided by Doxygen
(at the moment this includes the Perl Module-based LaTeX generator,
see \ref perlmod_latex "below") or write your own customized
generator. This should not be too hard if you have some knowledge of
Perl and it's the main purpose of including the Perl Module backend in
Doxygen. See \ref doxydocs_format "below" for details on how
to do this.
\section perlmod_latex Using the Perl Module-based LaTeX generator.
<p>The Perl Module-based LaTeX generator is pretty experimental and
incomplete at the moment, but you could find it useful nevertheless.
It can generate documentation for functions, typedefs and variables
within files and classes and can be customized quite a lot by
redefining TeX macros. However, there is still no documentation on
how to do this.
<p>Setting the <b>PERLMOD_LATEX</b> tag to <b>YES</b> in the Doxyfile
enables the creation of some additional files in the <b>perlmod/</b>
subdirectory of your output directory. These files contain the Perl
scripts and LaTeX code necessary to generate PDF and DVI output from
the Perl Module output, using PDFLaTeX and LaTeX respectively. Rules
to automate the use of these files are also added to
<b>doxyrules.make</b> and the <b>Makefile</b>.
<p>The additional generated files are the following:
<ul>
<li><b>doxylatex.pl</b>. This Perl script uses DoxyDocs.pm and
DoxyModel.pm to generate <b>doxydocs.tex</b>, a TeX file containing
the documentation in a format that can be accessed by LaTeX code. This
file is not directly LaTeXable.
<li><b>doxyformat.tex</b>. This file contains the LaTeX code that
transforms the documentation from doxydocs.tex into LaTeX text
suitable to be LaTeX'ed and presented to the user.
<li><b>doxylatex-template.pl</b>. This Perl script uses DoxyModel.pm
to generate <b>doxytemplate.tex</b>, a TeX file defining default
values for some macros. doxytemplate.tex is included by
doxyformat.tex to avoid the need of explicitly defining some macros.
<li><b>doxylatex.tex</b>. This is a very simple LaTeX document that
loads some packages and includes doxyformat.tex and doxydocs.tex. This
document is LaTeX'ed to produce the PDF and DVI documentation by the
rules added to <b>doxyrules.make</b>.
</ul>
\subsection pm_pdf_gen Simple creation of PDF and DVI output using the Perl Module-based LaTeX generator.
<p>To try this you need to have installed LaTeX, PDFLaTeX and the
packages used by <b>doxylatex.tex</b>.
<ol>
<li>Update your Doxyfile to the latest version using:
<pre>doxygen -u Doxyfile</pre>
<li>Set both <b>GENERATE_PERLMOD</b> and <b>PERLMOD_LATEX</b> tags to
YES in your Doxyfile.
<li>Run Doxygen on your Doxyfile:
<pre>doxygen Doxyfile</pre>
<li>A <b>perlmod/</b> subdirectory should have appeared in your output
directory. Enter the <b>perlmod/</b> subdirectory and run:
<pre>make pdf</pre>
<p>This should generate a <b>doxylatex.pdf</b> with the documentation
in PDF format.
<li>Run:
<pre>make dvi</pre>
<p>This should generate a <b>doxylatex.dvi</b> with the documentation
in DVI format.
</ol>
\section doxydocs_format Perl Module documentation format.
<p>The Perl Module documentation generated by Doxygen is stored in
<b>DoxyDocs.pm</b>. This is a very simple Perl module that contains
only two statements: an assigment to the variable <b>$doxydocs</b> and
the customary <b>1;</b> statement which usually ends Perl modules.
The documentation is stored in the variable <b>$doxydocs</b>, which
can then be accessed by a Perl script using <b>DoxyDocs.pm</b>.
<p><b>$doxydocs</b> contains a tree-like structure composed of three
types of nodes: strings, hashes and lists.
<ul>
<li><b>Strings</b>. These are normal Perl strings. They can be of
any length can contain any character. Their semantics depends on
their location within the tree. This type of node has no children.
<li><b>Hashes</b>. These are references to anonymous Perl hashes. A
hash can have multiple fields, each with a different key. The value
of a hash field can be a string, a hash or a list, and its semantics
depends on the key of the hash field and the location of the hash
within the tree. The values of the hash fields are the children of
the node.
<li><b>Lists</b>. These are references to anonymous Perl lists. A
list has an undefined number of elements, which are the children of
the node. Each element has the same type (string, hash or list) and
the same semantics, depending on the location of the list within the
tree.
</ul>
<p>As you can see, the documentation contained in <b>$doxydocs</b>
does not present any special impediment to be processed by a simple
Perl script. To be able to generate meaningful output using the
documentation contained in <b>$doxydocs</b> you'll probably need to
know the semantics of the nodes of the documentation tree, which we
present in \ref perlmod_tree "this page".
\section doxymodel_format Data structure describing the Perl Module documentation tree.
<p>You might be interested in processing the documentation contained
in <b>DoxyDocs.pm</b> without needing to take into account the
semantics of each node of the documentation tree. For this purpose,
Doxygen generates a <b>DoxyModel.pm</b> file which contains a data
structure describing the type and children of each node in the
documentation tree.
<p>The rest of this section is to be written yet, but in the meantime
you can look at the Perl scripts generated by Doxygen (such as
<b>doxylatex.pl</b> or <b>doxytemplate-latex.pl</b>) to get an idea on
how to use <b>DoxyModel.pm</b>.
*/
This diff is collapsed.
Summary: A documentation system for C/C++.
Name: doxygen
Version: 1.2.18_20021020
Version: 1.2.18_20021030
Release: 1
Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
......
......@@ -51,7 +51,7 @@ clean: Makefile.libdoxygen Makefile.doxygen Makefile.doxytag Makefile.doxysearch
$(MAKE) -f Makefile.doxysearch clean
distclean: clean
-$(RM) scanner.cpp doc.cpp code.cpp config.cpp pre.cpp ce_lex.cpp \
-$(RM) scanner.cpp code.cpp config.cpp pre.cpp ce_lex.cpp \
ce_parse.cpp ce_parse.h doxytag.cpp tag.cpp \
declinfo.cpp defargs.cpp commentcnv.cpp doctokenizer.cpp
......
......@@ -1580,7 +1580,7 @@ void Config::create()
cb = addBool(
"GENERATE_DEPRECATEDLIST",
"The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or \n"
"disable (NO) the deprecated list. This list is created by putting "
"disable (NO) the deprecated list. This list is created by putting \n"
"\\deprecated commands in the documentation.\n",
TRUE
);
......@@ -1986,7 +1986,7 @@ void Config::create()
cs->addDependency("GENERATE_LATEX");
cs = addString(
"LATEX_CMD_NAME",
"The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be "
"The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be \n"
"invoked. If left blank `latex' will be used as the default command name. \n"
);
cs->setDefaultValue("latex");
......@@ -2202,6 +2202,15 @@ void Config::create()
"moment. \n",
FALSE
);
cb = addBool(
"PERLMOD_LATEX",
"If the PERLMOD_LATEX tag is set to YES Doxygen will generate \n"
"the necessary Makefile rules, Perl scripts and LaTeX code to be able \n"
"to generate PDF and DVI output from the Perl module output.\n",
FALSE
);
cb->addDependency("GENERATE_PERLMOD");
//-----------------------------------------------------------------------------------------------
addInfo( "Preprocessor","Configuration options related to the preprocessor ");
//-----------------------------------------------------------------------------------------------
......@@ -2263,7 +2272,7 @@ void Config::create()
cl->addDependency("ENABLE_PREPROCESSING");
cl = addList(
"EXPAND_AS_DEFINED",
"If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then \n"
"If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then \n"
"this tag can be used to specify a list of macro names that should be expanded. \n"
"The macro definition that is found in the sources will be used. \n"
"Use the PREDEFINED tag if you want to use a different macro definition. \n"
......
......@@ -46,6 +46,8 @@
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// global variables during a call to validatingParseDoc
static bool g_hasParamCommand;
static MemberDef * g_memberDef;
......@@ -112,6 +114,104 @@ static void docParserPopContext()
//---------------------------------------------------------------------------
/*! search for an image in the imageNameDict and if found
* copies the image to the output directory (which is the
* html directory if type==0 or the latex directory if type==1)
*/
static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
{
QCString result;
bool ambig;
FileDef *fd;
//printf("Search for %s\n",fileName);
if ((fd=findFileDef(Doxygen::imageNameDict,fileName,ambig)))
{
QFile inImage(QString(fd->absFilePath().data()));
if (inImage.open(IO_ReadOnly))
{
result = fileName;
int i;
if ((i=result.findRev('/'))!=-1 || (i=result.findRev('\\'))!=-1)
{
result.right(result.length()-i-1);
}
QCString outputDir;
switch(type)
{
case DocImage::Html:
if (!Config_getBool("GENERATE_HTML")) return result;
outputDir = Config_getString("HTML_OUTPUT");
break;
case DocImage::Latex:
if (!Config_getBool("GENERATE_LATEX")) return result;
outputDir = Config_getString("LATEX_OUTPUT");
break;
case DocImage::Rtf:
if (!Config_getBool("GENERATE_RTF")) return result;
outputDir = Config_getString("RTF_OUTPUT");
break;
}
QCString outputFile = outputDir+"/"+result;
QFile outImage(QString(outputFile.data()));
if (outImage.open(IO_WriteOnly)) // copy the image
{
char *buffer = new char[inImage.size()];
inImage.readBlock(buffer,inImage.size());
outImage.writeBlock(buffer,inImage.size());
outImage.flush();
delete buffer;
}
else
{
warn(g_fileName,doctokenizerYYlineno,
"Warning: could not write output image %s",outputFile.data());
}
}
else
{
warn(g_fileName,doctokenizerYYlineno,
"Warning: could not open image %s",fileName);
}
if (type==DocImage::Latex && Config_getBool("USE_PDFLATEX") &&
fd->name().right(4)==".eps"
)
{ // we have an .eps image in pdflatex mode => convert it to a pdf.
QCString outputDir = Config_getString("LATEX_OUTPUT");
QCString baseName = fd->name().left(fd->name().length()-4);
QCString epstopdfArgs(4096);
epstopdfArgs.sprintf("\"%s/%s.eps\" --outfile=\"%s/%s.pdf\"",
outputDir.data(), baseName.data(),
outputDir.data(), baseName.data());
if (iSystem("epstopdf",epstopdfArgs,TRUE)!=0)
{
err("Error: Problems running epstopdf. Check your TeX installation!\n");
}
return baseName;
}
}
else if (ambig)
{
QCString text;
text.sprintf("Warning: image file name %s is ambigious.\n",fileName);
text+="Possible candidates:\n";
text+=showFileDefMatches(Doxygen::imageNameDict,fileName);
warn(g_fileName,doctokenizerYYlineno,text);
}
else
{
result=fileName;
if (result.left(5)!="http:" && result.left(6)!="https:")
{
warn(g_fileName,doctokenizerYYlineno,
"Warning: image file %s is not found in IMAGE_PATH: "
"assuming external image.",fileName
);
}
}
return result;
}
static void checkArgumentName(const QString &name,bool isParam)
{
if (g_memberDef==0) return; // not a member
......@@ -583,6 +683,7 @@ static bool defaultHandleToken(DocNode *parent,int tok, QList<DocNode> &children
children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Italic,TRUE));
int retval=handleStyleArgument(parent,children,tokenName);
children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Italic,FALSE));
children.append(new DocWhiteSpace(parent," "));
if (retval==TK_NEWPARA) goto handlepara;
}
break;
......@@ -591,6 +692,7 @@ static bool defaultHandleToken(DocNode *parent,int tok, QList<DocNode> &children
children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Bold,TRUE));
int retval=handleStyleArgument(parent,children,tokenName);
children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Bold,FALSE));
children.append(new DocWhiteSpace(parent," "));
if (retval==TK_NEWPARA) goto handlepara;
}
break;
......@@ -599,6 +701,7 @@ static bool defaultHandleToken(DocNode *parent,int tok, QList<DocNode> &children
children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Code,TRUE));
int retval=handleStyleArgument(parent,children,tokenName);
children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Code,FALSE));
children.append(new DocWhiteSpace(parent," "));
if (retval==TK_NEWPARA) goto handlepara;
}
break;
......@@ -1406,6 +1509,10 @@ DocRef::DocRef(DocNode *parent,const QString &target) :
m_file = compound->getOutputFileBase();
m_ref = compound->getReference();
}
else
{
err("%s:%d: Internal error: resolveLink successful but no compound found!\n",__FILE__,__LINE__);
}
}
else // oops, bogus target
{
......@@ -1456,6 +1563,11 @@ DocLink::DocLink(DocNode *parent,const QString &target) :
Definition *compound;
PageInfo *page;
QCString anchor;
m_refText = target;
if (!m_refText.isEmpty() && m_refText.at(0)=='#')
{
m_refText = m_refText.right(m_refText.length()-1);
}
if (resolveLink(g_context,stripKnownExtensions(target),g_inSeeBlock,
&compound,&page,anchor))
{
......@@ -1548,6 +1660,14 @@ QString DocLink::parse(bool isJavaLink)
}
endlink:
if (isJavaLink)
{
if (m_children.isEmpty()) // no link text
{
m_children.append(new DocWord(this,m_refText));
}
}
handlePendingStyleCommands(this,m_children);
DBG(("DocLink::parse() end\n"));
DocNode *n=g_nodeStack.pop();
......@@ -2671,7 +2791,7 @@ int DocParamList::parse(const QString &cmdName)
}
else if (m_type==DocParamSect::RetVal)
{
g_hasParamCommand=TRUE;
//g_hasParamCommand=TRUE;
checkArgumentName(g_token->name,FALSE);
}
m_params.append(g_token->name);
......@@ -2876,7 +2996,7 @@ void DocPara::handleImage(const QString &cmdName)
return;
}
doctokenizerYYsetStatePara();
DocImage *img = new DocImage(this,g_token->name,t);
DocImage *img = new DocImage(this,findAndCopyImage(g_token->name,t),t);
m_children.append(img);
img->parse();
}
......@@ -3043,16 +3163,19 @@ int DocPara::handleCommand(const QString &cmdName)
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,TRUE));
retval=handleStyleArgument(this,m_children,cmdName);
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,FALSE));
m_children.append(new DocWhiteSpace(this," "));
break;
case CMD_BOLD:
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Bold,TRUE));
retval=handleStyleArgument(this,m_children,cmdName);
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Bold,FALSE));
m_children.append(new DocWhiteSpace(this," "));
break;
case CMD_CODE:
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Code,TRUE));
retval=handleStyleArgument(this,m_children,cmdName);
m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Code,FALSE));
m_children.append(new DocWhiteSpace(this," "));
break;
case CMD_BSLASH:
m_children.append(new DocSymbol(this,DocSymbol::BSlash));
......
......@@ -586,6 +586,7 @@ class DocLink : public CompAccept<DocLink>, public DocNode
QString m_file;
QString m_ref;
QString m_anchor;
QString m_refText;
};
/*! @brief Node representing a reference to some item */
......
......@@ -1482,11 +1482,20 @@ static bool isVarWithConstructor(Entry *root)
bool result=FALSE;
bool typeIsClass;
Definition *ctx = 0;
FileDef *fd = 0;
bool ambig;
if (root->parent && root->parent->section&Entry::COMPOUND_MASK)
{ // inside a class
result=FALSE;
goto done;
}
else if ((fd = findFileDef(Doxygen::inputNameDict,root->fileName,ambig)) &&
fd->name().right(2)==".c"
)
{ // inside a .c file
result=FALSE;
goto done;
}
if (root->type.isEmpty())
{
result=FALSE;
......@@ -1534,7 +1543,7 @@ static bool isVarWithConstructor(Entry *root)
//printf("resType=%s\n",resType.data());
if (resType=="int" || resType=="long" || resType=="float" ||
resType=="double" || resType=="char" || resType=="signed" ||
resType=="const" || resType=="unsigned")
resType=="const" || resType=="unsigned" || resType=="void")
{
result=FALSE; // type keyword -> function prototype
goto done;
......@@ -3450,9 +3459,11 @@ static void computeClassRelations()
if ((cd==0 || (!cd->hasDocumentation() && !cd->isReference())) &&
bName.right(2)!="::")
{
if (!root->name.isEmpty() && root->name[0]!='@' &&
(guessSection(root->fileName)==Entry::HEADER_SEC || Config_getBool("EXTRACT_LOCAL_CLASSES")) &&
(root->protection!=Private || Config_getBool("EXTRACT_PRIVATE"))
if (!root->name.isEmpty() && root->name[0]!='@' && // normal name
(guessSection(root->fileName)==Entry::HEADER_SEC ||
Config_getBool("EXTRACT_LOCAL_CLASSES")) && // not defined in source file
(root->protection!=Private || Config_getBool("EXTRACT_PRIVATE")) && // hidden by protection
!Config_getBool("HIDE_UNDOC_CLASSES") // undocumented class are visible
)
warn_undoc(
root->fileName,root->startLine,
......@@ -7175,6 +7186,10 @@ void readConfiguration(int argc, char **argv)
/* Set the global html file extension. */
Doxygen::htmlFileExtension = Config_getString("HTML_FILE_EXTENSION");
/* Perlmod wants to know the path to the config file.*/
QFileInfo configFileInfo(configName);
setPerlModDoxyfile(configFileInfo.absFilePath());
/* init the special lists */
Doxygen::specialLists->setAutoDelete(TRUE);
Doxygen::specialLists->insert("todo",
......
......@@ -133,14 +133,14 @@ struct Grouping
{
GROUPING_LOWEST,
GROUPING_AUTO_WEAK =
GROUPING_LOWEST, //!< membership in group was defined via @weakgroup @{ @}
GROUPING_AUTO_ADD, //!< membership in group was defined via @add[to]group @{ @}
GROUPING_AUTO_DEF, //!< membership in group was defined via @defgroup @{ @}
GROUPING_LOWEST, //!< membership in group was defined via \@weakgroup \@{ \@}
GROUPING_AUTO_ADD, //!< membership in group was defined via \@add[to]group \@{ \@}
GROUPING_AUTO_DEF, //!< membership in group was defined via \@defgroup \@{ \@}
GROUPING_AUTO_HIGHEST =
GROUPING_AUTO_DEF,
GROUPING_INGROUP, //!< membership in group was defined by @ingroup
GROUPING_AUTO_DEF,
GROUPING_INGROUP, //!< membership in group was defined by \@ingroup
GROUPING_HIGHEST =
GROUPING_INGROUP
GROUPING_INGROUP
};
static const char *getGroupPriName( GroupPri_t priority )
......@@ -265,8 +265,8 @@ class Entry
QList<ArgumentList> *tArgLists; //!< template argument declarations
QCString program; //!< the program text
QCString initializer; //!< initial value (for variables)
QCString includeFile; //!< include file (2 arg of \class, must be unique)
QCString includeName; //!< include name (3 arg of \class)
QCString includeFile; //!< include file (2 arg of \\class, must be unique)
QCString includeName; //!< include name (3 arg of \\class)
QCString doc; //!< documentation block (partly parsed)
int docLine; //!< line number at which the documentation was found
QCString docFile; //!< file in which the documentation was found
......
......@@ -133,25 +133,25 @@ void HtmlDocVisitor::visit(DocStyleChange *s)
switch (s->style())
{
case DocStyleChange::Bold:
if (s->enable()) m_t << "<b>"; else m_t << "</b> ";
if (s->enable()) m_t << "<b>"; else m_t << "</b>";
break;
case DocStyleChange::Italic:
if (s->enable()) m_t << "<em>"; else m_t << "</em> ";
if (s->enable()) m_t << "<em>"; else m_t << "</em>";
break;
case DocStyleChange::Code:
if (s->enable()) m_t << "<code>"; else m_t << "</code> ";
if (s->enable()) m_t << "<code>"; else m_t << "</code>";
break;
case DocStyleChange::Subscript:
if (s->enable()) m_t << "<sub>"; else m_t << "</sub> ";
if (s->enable()) m_t << "<sub>"; else m_t << "</sub>";
break;
case DocStyleChange::Superscript:
if (s->enable()) m_t << "<sup>"; else m_t << "</sup> ";
if (s->enable()) m_t << "<sup>"; else m_t << "</sup>";
break;
case DocStyleChange::Center:
if (s->enable()) m_t << "<center>"; else m_t << "</center> ";
if (s->enable()) m_t << "<center>"; else m_t << "</center>";
break;
case DocStyleChange::Small:
if (s->enable()) m_t << "<small>"; else m_t << "</small> ";
if (s->enable()) m_t << "<small>"; else m_t << "</small>";
break;
}
}
......
......@@ -337,13 +337,13 @@ void HtmlHelp::initialize()
s_languageDict.insert("dutch", new QCString("0x413 Dutch"));
s_languageDict.insert("finnish", new QCString("0x40B Finnish"));
s_languageDict.insert("french", new QCString("0x40C French"));
s_languageDict.insert("german", new QCString("0x40C German"));
s_languageDict.insert("german", new QCString("0x407 German"));
s_languageDict.insert("greece", new QCString("0x408 Greece"));
s_languageDict.insert("hungarian",new QCString("0x40E Hungarian"));
s_languageDict.insert("italian", new QCString("0x410 Italian"));
s_languageDict.insert("norwegian",new QCString("0x814 Norwegian"));
s_languageDict.insert("polish", new QCString("0x815 Polish"));
s_languageDict.insert("portugese",new QCString("0x815 Portuguese(Portugal)"));
s_languageDict.insert("polish", new QCString("0x415 Polish"));
s_languageDict.insert("portugese",new QCString("0x816 Portuguese(Portugal)"));
s_languageDict.insert("brazil", new QCString("0x416 Portuguese(Brazil)"));
s_languageDict.insert("russian", new QCString("0x419 Russian"));
s_languageDict.insert("spanish", new QCString("0x40A Spannish(Traditional Sort)"));
......
......@@ -59,9 +59,6 @@ sub GenerateDep {
#$ GenerateDep("defargs.cpp","defargs.l");
$(LEX) -PdefargsYY -t defargs.l >defargs.cpp
#$ GenerateDep("doc.cpp","doc.l");
$(LEX) -PdocYY -t doc.l >doc.cpp
#$ GenerateDep("doctokenizer.cpp","doctokenizer.l");
$(LEX) -PdoctokenizerYY -t doctokenizer.l >doctokenizer.cpp
......
......@@ -90,17 +90,17 @@ class BaseOutputDocInterface : public BaseCodeDocInterface
const QCString &,bool) {}
virtual void parseText(const QCString &) {}
/*! Start of a bullet list: e.g. \c <ul> in html. writeListItem() is
/*! Start of a bullet list: e.g. \c \<ul\> in html. writeListItem() is
* Used for the bullet items.
*/
virtual void startItemList() = 0;
/*! Writes a list item for a bullet or enumerated
* list: e.g. \c <li> in html
* list: e.g. \c \<li\> in html
*/
virtual void writeListItem() = 0;
/*! Ends a bullet list: e.g. \c </ul> in html */
/*! Ends a bullet list: e.g. \c \</ul\> in html */
virtual void endItemList() = 0;
/*! Writes an ASCII string to the output. Converts characters that have
......@@ -184,19 +184,19 @@ class BaseOutputDocInterface : public BaseCodeDocInterface
/*! Writes a horizontal ruler to the output */
virtual void writeRuler() = 0;
/*! Starts a description list: e.g. \c <dl> in HTML
/*! Starts a description list: e.g. \c \<dl\> in HTML
* Items are surrounded by startDescItem() and endDescItem()
*/
virtual void startDescription() = 0;
/*! Ends a description list: e.g. \c </dl> in HTML */
/*! Ends a description list: e.g. \c \</dl\> in HTML */
virtual void endDescription() = 0;
/*! Starts an item of a description list: e.g. \c <dt> in HTML. */
/*! Starts an item of a description list: e.g. \c \<dt\> in HTML. */
virtual void startDescItem() = 0;
/*! Ends an item of a description list and starts the
* description itself: e.g. \c <dd> in HTML.
* description itself: e.g. \c \<dd\> in HTML.
*/
virtual void endDescItem() = 0;
......
This diff is collapsed.
......@@ -15,6 +15,9 @@
#ifndef PERLMODGEN_H
#define PERLMODGEN_H
void generatePerlMod();
class QString;
extern void setPerlModDoxyfile(const QString &);
extern void generatePerlMod();
#endif
......@@ -138,7 +138,7 @@ class TranslatorSpanish : public TranslatorAdapter_1_2_7
// quick reference sections
/*! This is put above each page as a link to the list of all groups of
* compounds or files (see the \group command).
* compounds or files (see the \\group command).
*/
virtual QCString trModules()
{ return "Módulos"; }
......
......@@ -39,6 +39,8 @@
* -------------+------------------------------------------------------------
* 2002-09-24 | Update for new since 1.2.17
* -------------+------------------------------------------------------------
* 2002-10-22 | Update for new since 1.2.18
* -------------+------------------------------------------------------------
*/
#ifndef TRANSLATOR_FR_H
#define TRANSLATOR_FR_H
......@@ -146,7 +148,7 @@ class TranslatorFrench : public TranslatorAdapter_1_2_17
// quick reference sections
/*! This is put above each page as a link to the list of all groups of
* compounds or files (see the \group command).
* compounds or files (see the \\group command).
*/
QCString trModules()
{ return "Modules"; }
......@@ -1282,6 +1284,22 @@ class TranslatorFrench : public TranslatorAdapter_1_2_17
return "Liste obsolète";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.2.18
//////////////////////////////////////////////////////////////////////////
/*! Used as a header for declaration section of the events found in
* a C# program
*/
virtual QCString trEvents()
{
return "Evènements";
}
/*! Header used for the documentation section of a class' events. */
virtual QCString trEventDocumentation()
{
return "Documentation des évènements";
}
};
#endif
......@@ -127,7 +127,7 @@ class TranslatorHungarian : public TranslatorAdapter_1_2_1
// quick reference sections
/*! This is put above each page as a link to the list of all groups of
* compounds or files (see the \group command).
* compounds or files (see the \\group command).
*/
QCString trModules()
{ return "Modulok"; }
......
......@@ -180,7 +180,7 @@ class TranslatorItalian : public TranslatorAdapter_1_2_18
// quick reference sections
/*! This is put above each page as a link to the list of all groups of
* compounds or files (see the \group command).
* compounds or files (see the \\group command).
*/
QCString trModules()
{ return "Moduli"; }
......
......@@ -172,7 +172,7 @@ class TranslatorJapanese : public TranslatorAdapter_1_2_18
// quick reference sections
/*! This is put above each page as a link to the list of all groups of
* compounds or files (see the \group command).
* compounds or files (see the \\group command).
*/
virtual QCString trModules()
{ return decode("モジュール"); }
......
......@@ -144,7 +144,7 @@ class TranslatorPolish : public TranslatorAdapter_1_2_17
// quick reference sections
/*! This is put above each page as a link to the list of all groups of
* compounds or files (see the \group command).
* compounds or files (see the \\group command).
*/
QCString trModules()
{ return "Modu³y"; }
......
......@@ -158,7 +158,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_2_18
// quick reference sections
/*! This is put above each page as a link to the list of all groups of
* compounds or files (see the \group command).
* compounds or files (see the \\group command).
*/
QCString trModules()
{ return "Módulos"; }
......
......@@ -167,7 +167,7 @@ class TranslatorRomanian: public TranslatorAdapter_1_2_16
// quick reference sections
/*! This is put above each page as a link to the list of all groups of
* compounds or files (see the \group command).
* compounds or files (see the \\group command).
*/
virtual QCString trModules()
{ return "Module"; }
......
......@@ -2570,6 +2570,7 @@ bool generateLink(OutputDocInterface &od,const char *clName,
linkText=linkText.right(linkText.length()-2);
}
}
//printf("generateLink linkText=%s\n",linkText.data());
if (resolveLink(clName,lr,inSeeBlock,&compound,&pageInfo,anchor))
{
if (pageInfo) // link to page
......@@ -2596,6 +2597,10 @@ bool generateLink(OutputDocInterface &od,const char *clName,
writePageRef(od,compound->getOutputFileBase(),anchor);
}
}
else
{
err("%s:%d: Internal error: resolveLink successful but no compound found!\n",__FILE__,__LINE__);
}
return TRUE;
}
else // link could not be found
......@@ -3267,7 +3272,7 @@ QList<ArgumentList> *copyArgumentLists(const QList<ArgumentList> *srcLists)
* that make up specialized classes. The switch \a parentOnly
* determines whether or not a template "at the end" of a scope
* should be considered, e.g. with \a parentOnly is \c TRUE, A<T>::B<S> will
* try to strip <T> and not <S>, while \a parentOnly is \c FALSE will
* try to strip \<T\> and not \<S\>, while \a parentOnly is \c FALSE will
* strip both unless A<T> or B<S> are specialized template classes.
*/
QCString stripTemplateSpecifiersFromScope(const QCString &fullName,
......
......@@ -573,6 +573,13 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De
linkifyText(TextGeneratorXMLImpl(t),scopeName,md->name(),a->defval);
t << "</defval>" << endl;
}
if (defArg && defArg->hasDocumentation())
{
t << " <briefdescription>";
writeXMLDocBlock(t,md->getDefFileName(),md->getDefLine(),
scopeName,md,defArg->docs);
t << "</briefdescription>" << endl;
}
t << " </param>" << endl;
if (defArg) ++defAli;
}
......@@ -610,7 +617,19 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De
MemberDef *emd;
for (emli.toFirst();(emd=emli.current());++emli)
{
t << " <enumvalue>" << endl;
ti << " <member refid=\"" << emd->getOutputFileBase()
<< "_1" << emd->anchor() << "\" kind=\"enumvalue\"><name>"
<< convertToXML(emd->name()) << "</name></member>" << endl;
t << " <enumvalue id=\"" << emd->getOutputFileBase() << "_1"
<< emd->anchor() << "\" prot=\"";
switch (emd->protection())
{
case Public: t << "public"; break;
case Protected: t << "protected"; break;
case Private: t << "private"; break;
}
t << "\">" << endl;
t << " <name>";
writeXMLString(t,emd->name());
t << "</name>" << endl;
......
This diff is collapsed.
......@@ -3,13 +3,111 @@ Microsoft Developer Studio Workspace File, Format Version 6.00
###############################################################################
Project: "Doxygen"=".\Doxygen.dsp" - Package Owner=<4>
Project: "Doxygen"=.\Doxygen.dsp - Package Owner=<4>
Package=<5>
{{{
begin source code control
Doxygen
..
.
end source code control
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name libpng
End Project Dependency
Begin Project Dependency
Project_Dep_Name zlib.dsp
End Project Dependency
Begin Project Dependency
Project_Dep_Name zlib
End Project Dependency
Begin Project Dependency
Project_Dep_Name Doxysearch
End Project Dependency
}}}
###############################################################################
Project: "Doxysearch"=.\Doxysearch.dsp - Package Owner=<4>
Package=<5>
{{{
begin source code control
Doxysearch
.
end source code control
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name Doxytag
End Project Dependency
}}}
###############################################################################
Project: "Doxytag"=.\Doxytag.dsp - Package Owner=<4>
Package=<5>
{{{
begin source code control
Doxytag
.
end source code control
}}}
Package=<4>
{{{
Begin Project Dependency
Project_Dep_Name qtools
End Project Dependency
}}}
###############################################################################
Project: "libpng"=.\libpng.dsp - Package Owner=<4>
Package=<5>
{{{
begin source code control
libpng
.
end source code control
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "qtools"=.\qtools.dsp - Package Owner=<4>
Package=<5>
{{{
begin source code control
qtools
.
end source code control
}}}
Package=<4>
{{{
}}}
###############################################################################
Project: "zlib"=.\zlib.dsp - Package Owner=<4>
Package=<5>
{{{
begin source code control
zlib
.
end source code control
}}}
......@@ -23,6 +121,10 @@ Global:
Package=<5>
{{{
begin source code control
Doxygen
.
end source code control
}}}
Package=<3>
......
# Microsoft Developer Studio Project File - Name="Doxysearch" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Console Application" 0x0103
CFG=Doxysearch - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "Doxysearch.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "Doxysearch.mak" CFG="Doxysearch - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "Doxysearch - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "Doxysearch - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName "Doxysearch"
# PROP Scc_LocalPath "."
CPP=xicl6.exe
RSC=rc.exe
!IF "$(CFG)" == "Doxysearch - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /W3 /GX /O2 /I "..\src" /D "_CONSOLE" /D "WIN32" /D "_MBCS" /D "NDEBUG" /FD /c
# SUBTRACT CPP /YX
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=snBsc.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=xilink6.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
!ELSEIF "$(CFG)" == "Doxysearch - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\src" /D "_CONSOLE" /D "WIN32" /D "_MBCS" /D "_DEBUG" /FD /GZ /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
# SUBTRACT RSC /x
BSC32=snBsc.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=xilink6.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# SUBTRACT LINK32 /nodefaultlib
!ENDIF
# Begin Target
# Name "Doxysearch - Win32 Release"
# Name "Doxysearch - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=..\src\doxysearch.cpp
# End Source File
# End Group
# End Target
# End Project
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "Doxysearch"=".\Doxysearch.dsp" - Package Owner=<4>
Package=<5>
{{{
begin source code control
Doxysearch
.
end source code control
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################
This diff is collapsed.
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "Doxytag"=".\Doxytag.dsp" - Package Owner=<4>
Package=<5>
{{{
begin source code control
Doxytag
.
end source code control
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################
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