summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Doxyfile42
-rw-r--r--INSTALL4
-rw-r--r--Makefile.in10
-rw-r--r--README4
-rw-r--r--VERSION2
-rw-r--r--addon/xmlgen/xml.cpp4
-rw-r--r--packages/rpm/doxygen.spec2
-rw-r--r--qtools/Doxyfile166
-rw-r--r--src/classdef.cpp26
-rw-r--r--src/classdef.h160
-rw-r--r--src/diagram.cpp4
-rw-r--r--src/doc.l33
-rw-r--r--src/dot.cpp12
-rw-r--r--src/doxygen.cpp26
-rw-r--r--src/doxysearch.cpp8
-rw-r--r--src/doxytag.l5
-rw-r--r--src/htmlgen.cpp10
-rw-r--r--src/htmlgen.h4
-rw-r--r--src/index.cpp18
-rw-r--r--src/latexgen.cpp374
-rw-r--r--src/latexgen.h13
-rw-r--r--src/mangen.cpp7
-rw-r--r--src/mangen.h5
-rw-r--r--src/outputgen.h14
-rw-r--r--src/outputlist.h8
-rw-r--r--src/packagedef.cpp3
-rw-r--r--src/packagedef.h2
-rw-r--r--src/rtfgen.cpp31
-rw-r--r--src/rtfgen.h4
-rw-r--r--src/scanner.l24
-rw-r--r--src/tagreader.cpp53
-rw-r--r--src/translator.h26
-rw-r--r--src/translator_de.h8
-rw-r--r--src/translator_fr.h6
34 files changed, 763 insertions, 355 deletions
diff --git a/Doxyfile b/Doxyfile
index 9293e90..9cfba1c 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -1,4 +1,4 @@
-# Doxyfile 1.2.3-20001126
+# Doxyfile 1.2.5-20010304
#---------------------------------------------------------------------------
# General configuration options
@@ -35,7 +35,11 @@ TAB_SIZE = 8
ENABLED_SECTIONS =
GENERATE_TODOLIST = YES
GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
ALIASES =
+MAX_INITIALIZER_LINES = 30
+OPTIMIZE_OUTPUT_FOR_C = NO
+SHOW_USED_FILES = YES
#---------------------------------------------------------------------------
# configuration options related to warning and progress messages
#---------------------------------------------------------------------------
@@ -47,22 +51,9 @@ WARN_LOGFILE =
#---------------------------------------------------------------------------
# configuration options related to the input files
#---------------------------------------------------------------------------
-INPUT = src \
- qtools \
- $(QTDIR)/src/doc/qarray.doc \
- $(QTDIR)/src/doc/qdict.doc \
- $(QTDIR)/src/doc/qintdict.doc \
- $(QTDIR)/src/doc/qlist.doc \
- $(QTDIR)/src/doc/qptrdict.doc \
- $(QTDIR)/src/doc/qsortedlist.doc \
- $(QTDIR)/src/doc/qstack.doc \
- $(QTDIR)/src/doc/qstrlist.doc \
- $(QTDIR)/src/doc/qvector.doc \
- $(QTDIR)/src/doc/qvaluelist.doc \
- $(QTDIR)/src/doc/qtl.doc
+INPUT = src
FILE_PATTERNS = *.h \
*.cpp \
- q*.doc
RECURSIVE = NO
EXCLUDE = src/code.cpp \
src/config.cpp \
@@ -75,7 +66,12 @@ EXCLUDE = src/code.cpp \
src/scanner.cpp \
src/tag.cpp \
src/doc.cpp \
- src/logos.cpp
+ src/logos.cpp \
+ src/doxysearch.cpp \
+ src/suffixtree.cpp \
+ src/suffixtree.h \
+ src/searchindex.cpp \
+ src/searchindex.h
EXCLUDE_PATTERNS =
EXAMPLE_PATH =
EXAMPLE_PATTERNS =
@@ -98,6 +94,9 @@ HTML_FOOTER =
HTML_STYLESHEET =
HTML_ALIGN_MEMBERS = YES
GENERATE_HTMLHELP = NO
+GENERATE_CHI = NO
+BINARY_TOC = NO
+TOC_EXPAND = NO
DISABLE_INDEX = NO
ENUM_VALUES_PER_LINE = 4
GENERATE_TREEVIEW = NO
@@ -129,10 +128,6 @@ GENERATE_MAN = NO
MAN_OUTPUT =
MAN_EXTENSION = .3
#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-GENERATE_XML = NO
-#---------------------------------------------------------------------------
# Configuration options related to the preprocessor
#---------------------------------------------------------------------------
ENABLE_PREPROCESSING = YES
@@ -146,7 +141,7 @@ EXPAND_AS_DEFINED =
#---------------------------------------------------------------------------
# Configuration::addtions related to external references
#---------------------------------------------------------------------------
-TAGFILES =
+TAGFILES = qtools_docs/qtools.tag=../../qtools_docs/html
GENERATE_TAGFILE =
ALLEXTERNALS = NO
PERL_PATH = /usr/bin/perl
@@ -160,9 +155,10 @@ INCLUDE_GRAPH = YES
INCLUDED_BY_GRAPH = NO
GRAPHICAL_HIERARCHY = YES
DOT_PATH =
-MAX_DOT_GRAPH_WIDTH = 2048
-MAX_DOT_GRAPH_HEIGHT = 2048
+MAX_DOT_GRAPH_WIDTH = 1024
+MAX_DOT_GRAPH_HEIGHT = 1024
GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
#---------------------------------------------------------------------------
# Configuration::addtions related to the search engine
#---------------------------------------------------------------------------
diff --git a/INSTALL b/INSTALL
index 693d8bc..7cb772e 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,6 +1,6 @@
-DOXYGEN Version 1.2.5-20010304
+DOXYGEN Version 1.2.6
Please read the installation section of the manual for instructions.
--------
-Dimitri van Heesch (04 March 2001)
+Dimitri van Heesch (11 March 2001)
diff --git a/Makefile.in b/Makefile.in
index c5cc66e..2b38472 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -55,16 +55,16 @@ install: doxywizard_install
$(INSTTOOL) -m 755 bin/doxysearch $(INSTALL)/bin
cp -r doc $(DOCDIR)
cp -r examples $(DOCDIR)
- echo "DOXYGEN = $(INSTALL)" > $(DOCDIR)/doc/Makefile
- echo "DOXYDOCS = .." >> $(DOCDIR)/doc/Makefile
+ echo "DOXYGEN = $(INSTALL)" > $(DOCDIR)/doc/Makefile
+ echo "DOXYDOCS = .." >> $(DOCDIR)/doc/Makefile
echo "VERSION = $(VERSION)" >> $(DOCDIR)/doc/Makefile
- cat doc/Makefile.in >> $(DOCDIR)/doc/Makefile
+ cat doc/Makefile.in >> $(DOCDIR)/doc/Makefile
cd $(DOCDIR)/examples ; $(MAKE)
cd $(DOCDIR)/doc ; $(MAKE)
rm -rf $(DOCDIR)/doc
cd $(DOCDIR)/latex ; $(MAKE)
- cp $(DOCDIR)/latex/doxygen_manual.pdf $(INSTALL)/doc/doxygen
- cp $(DOCDIR)/latex/doxygen_manual.ps $(INSTALL)/doc/doxygen
+ cp $(DOCDIR)/latex/doxygen_manual.pdf $(DOCDIR)
+ cp $(DOCDIR)/latex/doxygen_manual.ps $(DOCDIR)
rm -rf $(DOCDIR)/latex
docs: FORCE
diff --git a/README b/README
index f73e3d2..3d9ec16 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-DOXYGEN Version 1.2.5-20010304
+DOXYGEN Version 1.2.6
Please read INSTALL for compilation instructions.
@@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at
Enjoy,
-Dimitri van Heesch (04 March 2001)
+Dimitri van Heesch (11 March 2001)
diff --git a/VERSION b/VERSION
index 597f916..3c43790 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.2.5-20010304
+1.2.6
diff --git a/addon/xmlgen/xml.cpp b/addon/xmlgen/xml.cpp
index 93c1250..ecb3fce 100644
--- a/addon/xmlgen/xml.cpp
+++ b/addon/xmlgen/xml.cpp
@@ -329,10 +329,10 @@ void generateXMLForClass(ClassDef *cd,QTextStream &t)
}
t << " </basecompoundlist>" << endl;
}
- if (cd->superClasses()->count()>0)
+ if (cd->subClasses()->count()>0)
{
t << " <derivedcompoundlist>" << endl;
- BaseClassListIterator bcli(*cd->superClasses());
+ BaseClassListIterator bcli(*cd->subClasses());
BaseClassDef *bcd;
for (bcli.toFirst();(bcd=bcli.current());++bcli)
{
diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec
index c71bdd7..516a4d6 100644
--- a/packages/rpm/doxygen.spec
+++ b/packages/rpm/doxygen.spec
@@ -1,5 +1,5 @@
Name: doxygen
-Version: 1.2.5-20010304
+Version: 1.2.6
Summary: documentation system for C, C++ and IDL
Release: 1
Source0: doxygen-%{version}.src.tar.gz
diff --git a/qtools/Doxyfile b/qtools/Doxyfile
new file mode 100644
index 0000000..8a54cc9
--- /dev/null
+++ b/qtools/Doxyfile
@@ -0,0 +1,166 @@
+# Doxyfile 1.2.5-20010304
+
+#---------------------------------------------------------------------------
+# General configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME = Doxygen
+PROJECT_NUMBER =
+OUTPUT_DIRECTORY = ../qtools_docs
+OUTPUT_LANGUAGE = English
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+EXTRACT_STATIC = YES
+HIDE_UNDOC_MEMBERS = NO
+HIDE_UNDOC_CLASSES = NO
+BRIEF_MEMBER_DESC = YES
+REPEAT_BRIEF = YES
+ALWAYS_DETAILED_SEC = NO
+FULL_PATH_NAMES = YES
+STRIP_FROM_PATH = $(PWD)/
+INTERNAL_DOCS = NO
+CLASS_DIAGRAMS = YES
+SOURCE_BROWSER = YES
+INLINE_SOURCES = NO
+STRIP_CODE_COMMENTS = YES
+CASE_SENSE_NAMES = NO
+HIDE_SCOPE_NAMES = NO
+VERBATIM_HEADERS = YES
+SHOW_INCLUDE_FILES = YES
+JAVADOC_AUTOBRIEF = YES
+INHERIT_DOCS = YES
+INLINE_INFO = YES
+SORT_MEMBER_DOCS = YES
+DISTRIBUTE_GROUP_DOC = NO
+TAB_SIZE = 8
+ENABLED_SECTIONS =
+GENERATE_TODOLIST = YES
+GENERATE_TESTLIST = YES
+GENERATE_BUGLIST = YES
+ALIASES =
+MAX_INITIALIZER_LINES = 30
+OPTIMIZE_OUTPUT_FOR_C = NO
+SHOW_USED_FILES = YES
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET = NO
+WARNINGS = YES
+WARN_IF_UNDOCUMENTED = YES
+WARN_FORMAT = "$file:$line: $text"
+WARN_LOGFILE =
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT = . \
+ $(QTDIR)/src/doc/qarray.doc \
+ $(QTDIR)/src/doc/qdict.doc \
+ $(QTDIR)/src/doc/qintdict.doc \
+ $(QTDIR)/src/doc/qlist.doc \
+ $(QTDIR)/src/doc/qptrdict.doc \
+ $(QTDIR)/src/doc/qsortedlist.doc \
+ $(QTDIR)/src/doc/qstack.doc \
+ $(QTDIR)/src/doc/qstrlist.doc \
+ $(QTDIR)/src/doc/qvector.doc \
+ $(QTDIR)/src/doc/qvaluelist.doc \
+ $(QTDIR)/src/doc/qtl.doc
+FILE_PATTERNS = *.h \
+ *.cpp \
+ q*.doc
+RECURSIVE = NO
+EXCLUDE_PATTERNS =
+EXAMPLE_PATH =
+EXAMPLE_PATTERNS =
+IMAGE_PATH =
+INPUT_FILTER =
+FILTER_SOURCE_FILES = NO
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX = YES
+COLS_IN_ALPHA_INDEX = 5
+IGNORE_PREFIX =
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML = YES
+HTML_OUTPUT =
+HTML_HEADER =
+HTML_FOOTER =
+HTML_STYLESHEET =
+HTML_ALIGN_MEMBERS = YES
+GENERATE_HTMLHELP = NO
+GENERATE_CHI = NO
+BINARY_TOC = NO
+TOC_EXPAND = NO
+DISABLE_INDEX = NO
+ENUM_VALUES_PER_LINE = 4
+GENERATE_TREEVIEW = NO
+TREEVIEW_WIDTH = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX = NO
+LATEX_OUTPUT =
+COMPACT_LATEX = NO
+PAPER_TYPE = a4wide
+EXTRA_PACKAGES =
+LATEX_HEADER =
+PDF_HYPERLINKS = NO
+USE_PDFLATEX = NO
+LATEX_BATCHMODE = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF = NO
+RTF_OUTPUT =
+COMPACT_RTF = NO
+RTF_HYPERLINKS = NO
+RTF_STYLESHEET_FILE =
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN = NO
+MAN_OUTPUT =
+MAN_EXTENSION = .3
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING = YES
+MACRO_EXPANSION = YES
+EXPAND_ONLY_PREDEF = YES
+SEARCH_INCLUDES = YES
+INCLUDE_PATH =
+INCLUDE_FILE_PATTERNS =
+PREDEFINED =
+EXPAND_AS_DEFINED =
+#---------------------------------------------------------------------------
+# Configuration::addtions related to external references
+#---------------------------------------------------------------------------
+TAGFILES =
+GENERATE_TAGFILE = ../qtools_docs/qtools.tag
+ALLEXTERNALS = NO
+PERL_PATH = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool
+#---------------------------------------------------------------------------
+HAVE_DOT = YES
+CLASS_GRAPH = YES
+COLLABORATION_GRAPH = YES
+INCLUDE_GRAPH = YES
+INCLUDED_BY_GRAPH = NO
+GRAPHICAL_HIERARCHY = YES
+DOT_PATH =
+MAX_DOT_GRAPH_WIDTH = 2048
+MAX_DOT_GRAPH_HEIGHT = 2048
+GENERATE_LEGEND = YES
+DOT_CLEANUP = YES
+#---------------------------------------------------------------------------
+# Configuration::addtions related to the search engine
+#---------------------------------------------------------------------------
+SEARCHENGINE = NO
+CGI_NAME = search.cgi
+CGI_URL =
+DOC_URL =
+DOC_ABSPATH =
+BIN_ABSPATH = /usr/local/bin/
+EXT_DOC_PATHS =
diff --git a/src/classdef.cpp b/src/classdef.cpp
index a84d03f..b335af7 100644
--- a/src/classdef.cpp
+++ b/src/classdef.cpp
@@ -138,11 +138,11 @@ void ClassDef::insertBaseClass(ClassDef *cd,const char *n,Protection p,
inherits->append(new BaseClassDef(cd,n,p,s,t));
}
-// inserts a super class in the inherited list
-void ClassDef::insertSuperClass(ClassDef *cd,Protection p,
+// inserts a sub class in the inherited list
+void ClassDef::insertSubClass(ClassDef *cd,Protection p,
Specifier s,const char *t)
{
- //printf("*** insert super class %s into %s\n",cd->name().data(),name().data());
+ //printf("*** insert sub class %s into %s\n",cd->name().data(),name().data());
inheritedBy->inSort(new BaseClassDef(cd,0,p,s,t));
}
@@ -732,7 +732,7 @@ void ClassDef::writeDocumentation(OutputList &ol)
if (Config::classDiagramFlag) ol.disableAllBut(OutputGenerator::Man);
- // write superclasses
+ // write subclasses
int count;
if ((count=inherits->count())>0)
{
@@ -856,7 +856,9 @@ void ClassDef::writeDocumentation(OutputList &ol)
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
ol.writeString("<center><font size=\"2\">[");
- ol.writeHtmlLink("graph_legend.html",theTranslator->trLegend());
+ ol.startHtmlLink("graph_legend.html");
+ ol.docify(theTranslator->trLegend());
+ ol.endHtmlLink();
ol.writeString("]</font></center>");
ol.popGeneratorState();
}
@@ -889,7 +891,9 @@ void ClassDef::writeDocumentation(OutputList &ol)
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
ol.writeString("<center><font size=\"2\">[");
- ol.writeHtmlLink("graph_legend.html",theTranslator->trLegend());
+ ol.startHtmlLink("graph_legend.html");
+ ol.docify(theTranslator->trLegend());
+ ol.endHtmlLink();
ol.writeString("]</font></center>");
ol.popGeneratorState();
}
@@ -1465,7 +1469,7 @@ bool ClassDef::isLinkableInProject()
/*! the class is visible in a class diagram, or class hierarchy */
bool ClassDef::isVisibleInHierarchy()
-{ return // show all classes or a superclass is visible
+{ return // show all classes or a subclass is visible
(Config::allExtFlag || hasNonReferenceSuperClass()) &&
// and not an annonymous compound
name().find('@')==-1 &&
@@ -1501,7 +1505,7 @@ bool ClassDef::isBaseClass(ClassDef *bcd)
/*!
* recusively merges the `all members' lists of a class base
* with that of this class. Must only be called for classes without
- * superclasses!
+ * subclasses!
*/
void ClassDef::mergeMembers()
@@ -1527,7 +1531,7 @@ void ClassDef::mergeMembers()
MemberNameInfo *dstMni;
if ((dstMni=dstMnd->find(srcMni->memberName())))
// a member with that name is already in the class.
- // the member may hide or reimplement the one in the super class
+ // the member may hide or reimplement the one in the sub class
// or there may be another path to the base class that is already
// visited via another branch in the class hierarchy.
{
@@ -1643,13 +1647,13 @@ void ClassDef::mergeMembers()
}
}
}
- else // base class has a member that is not in the super class => copy
+ else // base class has a member that is not in the sub class => copy
{
// create a deep copy of the list (only the MemberInfo's will be
// copied, not the actual MemberDef's)
MemberNameInfo *newMni = new MemberNameInfo(srcMni->memberName());
- // copy the member(s) from the base to the super class
+ // copy the member(s) from the base to the sub class
MemberNameInfoIterator mnii(*srcMni);
MemberInfo *mi;
for (;(mi=mnii.current());++mnii)
diff --git a/src/classdef.h b/src/classdef.h
index 12cf575..c02fd89 100644
--- a/src/classdef.h
+++ b/src/classdef.h
@@ -48,92 +48,118 @@ struct IncludeInfo;
/*! \brief This class contains all information about a compound.
*
- * A compound can be a class, struct, union, interface, or exception
+ * A compound can be a class, struct, union, interface, or exception.
+ * \note This class should be renamed to CompoundDef
*/
class ClassDef : public Definition
{
public:
+ /*! \name Public API
+ * \{
+ */
+
+ /*! The various compound types */
enum CompoundType { Class=Entry::CLASS_SEC,
Struct=Entry::STRUCT_SEC,
Union=Entry::UNION_SEC,
Interface=Entry::INTERFACE_SEC,
Exception=Entry::EXCEPTION_SEC
};
- ClassDef(const char *fileName,int startLine,
- const char *name,CompoundType ct,
- const char *ref=0,const char *fName=0);
- ~ClassDef();
DefType definitionType() { return TypeClass; }
QCString getOutputFileBase() const { return fileName; }
+
+ /*! Returns the name as it is appears in the documentation */
QCString displayName() const;
+
+ /*! Returns the type of compound this is */
CompoundType compoundType() const { return compType; }
+
+ /*! Returns the type of compound as a string */
QCString compoundTypeString() const;
- void insertBaseClass(ClassDef *,const char *name,Protection p,Specifier s,const char *t=0);
+
+ /*! Returns the list of base classes from which this class directly
+ * inherits.
+ */
BaseClassList *baseClasses() { return inherits; }
- void insertSuperClass(ClassDef *,Protection p,Specifier s,const char *t=0);
- BaseClassList *superClasses() { return inheritedBy; }
- void setIncludeFile(FileDef *fd,const char *incName,bool local);
+
+ /*! Returns the list of sub classes that directly inherit from this class
+ */
+ BaseClassList *subClasses() { return inheritedBy; }
+
+ /*! Returns a list of all members. This includes any inherited members.
+ * Members are sorted alphabetically.
+ */
MemberNameInfoList *memberNameInfoList() { return allMemberNameInfoList; }
+
+ /*! Returns a dictionary of all members. This includes any inherited
+ * members. Members are sorted alphabetically.
+ */
MemberNameInfoDict *memberNameInfoDict() { return allMemberNameInfoDict; }
- void insertMember(MemberDef *);
- void insertUsedFile(const char *);
- void computeAnchors();
- void computeMemberGroups();
- void setAnchor(MemberDef *);
- void dumpMembers();
+
void writeDocumentation(OutputList &ol);
void writeMemberList(OutputList &ol);
void writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup);
- bool addExample(const char *anchor,const char *name, const char *file);
- bool hasExamples();
- void setProtection(Protection p) { prot=p; }
+
+ /*! Return the protection level (Public,Protected,Private) in which
+ * this compound was found.
+ */
Protection protection() const { return prot; }
+
+ /*! returns TRUE iff a link is possible to an item within this project.
+ */
bool isLinkableInProject();
- /*! a link to this class is possible (either within this project,
- * or as a cross-reference to another project
+
+ /*! return TRUE iff a link to this class is possible (either within
+ * this project, or as a cross-reference to another project).
*/
bool isLinkable()
{
return isLinkableInProject() || isReference();
}
- bool hasNonReferenceSuperClass();
+
/*! the class is visible in a class diagram, or class hierarchy */
bool isVisibleInHierarchy();
- // template argument functions
+ /*! Returns the template arguments of this class
+ * Will return 0 if not applicable.
+ */
ArgumentList *templateArguments() const { return tempArgs; }
+
+ /*! Returns the template arguments that this nested class "inherits"
+ * from its outer class (doxygen assumes there is only one!).
+ * Will return 0 if not applicable.
+ */
ArgumentList *outerTemplateArguments() const;
- void setTemplateArguments(ArgumentList *al);
- //QCString getTemplateNameString();
+ /*! Returns the namespace this compound is in, or 0 if it has a global
+ * scope.
+ */
NamespaceDef *getNamespaceDef() { return nspace; }
- FileDef *getFileDef() const { return fileDef; }
+
+ /*! Returns the file in which this compound's definition can be found.
+ * Should not return 0 (but it might be a good idea to check anyway).
+ */
+ FileDef *getFileDef() const { return fileDef; }
+
+ /*! Returns the Java package this class is in or 0 if not applicable.
+ */
+ PackageDef *packageDef() const;
- void setNamespace(NamespaceDef *nd) { nspace = nd; }
- void setFileDef(FileDef *fd) { fileDef=fd; }
- void mergeMembers();
+ /*! Returns TRUE iff \a bcd is a direct or indirect base class of this
+ * class. This function will recusively traverse all branches of the
+ * inheritance tree.
+ */
bool isBaseClass(ClassDef *bcd);
- void determineImplUsageRelation();
- void determineIntfUsageRelation();
+
UsesClassDict *usedImplementationClasses() const
{
return usesImplClassDict;
}
+
UsesClassDict *usedInterfaceClasses() const
{
return usesIntfClassDict;
}
- void setSubGrouping(bool enabled) { subGrouping = enabled; }
-
- bool visited;
-
- void addMembersToMemberGroup();
- void distributeMemberGroupDocumentation();
-
- //void generateXML(QTextStream &t);
- //void generateXMLSection(QTextStream &t,MemberList *ml,const char *type);
-
- PackageDef *packageDef() const;
/* member lists by protection */
MemberList pubMembers;
@@ -170,9 +196,60 @@ class ClassDef : public Definition
MemberList variableMembers;
MemberList propertyMembers;
+ /*! \} */
+
+ /*! \name Doxygen internal API
+ * \{
+ */
+ void insertBaseClass(ClassDef *,const char *name,Protection p,Specifier s,const char *t=0);
+ void insertSubClass(ClassDef *,Protection p,Specifier s,const char *t=0);
+ void setIncludeFile(FileDef *fd,const char *incName,bool local);
+ void insertMember(MemberDef *);
+ void insertUsedFile(const char *);
+ void computeAnchors();
+ void computeMemberGroups();
+ void setAnchor(MemberDef *);
+ void dumpMembers();
+ bool addExample(const char *anchor,const char *name, const char *file);
+ void addMembersToMemberGroup();
+ void distributeMemberGroupDocumentation();
+ void setNamespace(NamespaceDef *nd) { nspace = nd; }
+ void setTemplateArguments(ArgumentList *al);
+ void mergeMembers();
+ void setFileDef(FileDef *fd) { fileDef=fd; }
+ void determineImplUsageRelation();
+ void determineIntfUsageRelation();
+ void setSubGrouping(bool enabled) { subGrouping = enabled; }
+ void setProtection(Protection p) { prot=p; }
+
+ /*! Creates a new compound definition.
+ * \param fileName full path and file name in which this compound was
+ * found.
+ * \param startLine line number where the definition of this compound
+ * starts.
+ * \param name the name of this compound (including scope)
+ * \param ct the kind of Compound
+ * \param ref the tag file from which this compound is extracted
+ * or 0 if the compound doesn't come from a tag file
+ * \param fName the file name as found in the tag file.
+ * This overwrites the file that doxygen normally
+ * generates based on the compound type & name.
+ */
+ ClassDef(const char *fileName,int startLine,
+ const char *name,CompoundType ct,
+ const char *ref=0,const char *fName=0);
+ /*! Destroys a compound definition. */
+ ~ClassDef();
+
+ bool visited;
+
protected:
void addUsedInterfaceClasses(MemberDef *md,const char *typeStr);
void addMemberListToGroup(MemberList *);
+ bool hasExamples();
+ bool hasNonReferenceSuperClass();
+
+ /*! \} */
private:
QCString fileName; // HTML containing the class docs
@@ -184,7 +261,6 @@ class ClassDef : public Definition
BaseClassList *inheritedBy;
NamespaceDef *nspace; // the namespace this class is in
-
/* user defined member groups */
MemberGroupList *memberGroupList;
MemberGroupDict *memberGroupDict;
diff --git a/src/diagram.cpp b/src/diagram.cpp
index a499097..681fc89 100644
--- a/src/diagram.cpp
+++ b/src/diagram.cpp
@@ -249,8 +249,8 @@ void DiagramRow::insertClass(DiagramItem *parent,ClassDef *cd,bool doBases,
if (parent) parent->addChild(di);
di->move(count()*gridWidth,level*gridHeight);
append(di);
- BaseClassList *bcl=doBases ? cd->baseClasses() : cd->superClasses();
- /* there are base/super classes */
+ BaseClassList *bcl=doBases ? cd->baseClasses() : cd->subClasses();
+ /* there are base/sub classes */
int count=0;
BaseClassDef *bcd=bcl->first();
while (bcd)
diff --git a/src/doc.l b/src/doc.l
index f5afe59..2c0dab5 100644
--- a/src/doc.l
+++ b/src/doc.l
@@ -88,6 +88,7 @@ static bool inWarningBlock;
static bool inRemarkBlock;
static bool inAttentionBlock;
static bool inParBlock;
+static bool insideHtmlLink;
static QCString sectionRef;
static bool insideVerbatim = FALSE;
static bool insidePre = FALSE;
@@ -134,6 +135,7 @@ static void initParser()
inRemarkBlock = FALSE;
inAttentionBlock = FALSE;
inParBlock = FALSE;
+ insideHtmlLink = FALSE;
}
//-----------------------------------------------------------------------------
@@ -840,8 +842,7 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
%x DocDontInclude
%x DocHtmlLink
%x DocHtmlAnchor
-%x DocHtmlHref1
-%x DocHtmlHref2
+%x DocHtmlHref
%x DocSkiplineKey
%x DocSkipKey
%x DocLineKey
@@ -889,6 +890,7 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
<DocScan,Text>"&"[AEIOUaeiou]"circ;" { outDoc->writeCirc(yytext[1]); }
<DocScan,Text>"&"[ANOano]"tilde;" { outDoc->writeTilde(yytext[1]); }
<DocScan,Text>"&szlig;" { outDoc->writeSharpS(); }
+<DocScan,Text>"&"[cC]"cedil;" { outDoc->writeCCedil(yytext[1]); }
<DocScan,Text>"&[aA]ring;" { outDoc->writeRing(yytext[1]); }
<DocScan,DocHtmlScan,DocLatexScan>"$("[a-z_A-Z]+")" {
QCString envvar=&yytext[2];
@@ -1784,7 +1786,10 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
removeRedundantWhiteSpace(oName),inSeeBlock);
BEGIN(DocScan);
}
-<DocScan>("http:"|"https:"|"ftp:"|"file:"){URLMASK} { outDoc->writeHtmlLink(yytext,yytext); }
+<DocScan>("http:"|"https:"|"ftp:"|"file:"){URLMASK} { outDoc->startHtmlLink(yytext);
+ outDoc->docify(yytext);
+ outDoc->endHtmlLink();
+ }
<DocScan>[a-zA-Z_0-9\.\-]+"@"[0-9a-z_A-Z\.\-]+ { outDoc->writeMailLink(yytext); }
<DocScan>{FILESCHAR}*{FILEECHAR}+/".\\n" { // special exception that is otherwise matches by FILEMASK
generateRef(*outDoc,className,yytext,inSeeBlock);
@@ -2036,7 +2041,12 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
<DocScan>"<"{BR}{ATTR}">" { outDoc->lineBreak(); }
<DocScan>"<"{I}{ATTR}">" { outDoc->startEmphasis(); }
<DocScan>"</"{I}{ATTR}">" { outDoc->endEmphasis(); }
-<DocScan>"</"{A}{ATTR}">"
+<DocScan>"</"{A}{ATTR}">" { if (insideHtmlLink)
+ {
+ outDoc->endHtmlLink();
+ insideHtmlLink=FALSE;
+ }
+ }
<DocScan>"<"{A} { BEGIN(DocHtmlLink); }
<DocScan>"<"{BOLD}{ATTR}">" { outDoc->startBold(); }
<DocScan>"</"{BOLD}{ATTR}">" { outDoc->endBold(); }
@@ -2055,16 +2065,15 @@ OPMASK ({B}*{OPNORM}({OPARG}?))|({OPCAST}{OPARG})
<DocHtmlLink>{HREF}{BN}*"="{BN}*("\""?) {
htmlUrl.resize(0);
htmlText.resize(0);
- BEGIN(DocHtmlHref1); }
-<DocHtmlHref1>{URLMASK} {
+ BEGIN(DocHtmlHref);
+ }
+<DocHtmlHref>{URLMASK} {
htmlUrl=yytext;
}
-<DocHtmlHref1>">" { BEGIN(DocHtmlHref2); }
-<DocHtmlHref2>[^<]* { htmlText+=yytext; }
-<DocHtmlHref2>"<" {
- outDoc->writeHtmlLink(htmlUrl,htmlText);
- unput(*yytext);
- BEGIN(DocScan);
+<DocHtmlHref>">" {
+ outDoc->startHtmlLink(htmlUrl);
+ insideHtmlLink=TRUE;
+ BEGIN(DocScan);
}
<DocHtmlLink,DocHtmlAnchor>">" { BEGIN(DocScan); }
<DocScan>{CMD}("\\"|"@"|"<"|">"|"&"|"$"|"#"|"%") {
diff --git a/src/dot.cpp b/src/dot.cpp
index 7b3309c..f060f88 100644
--- a/src/dot.cpp
+++ b/src/dot.cpp
@@ -154,7 +154,7 @@ static bool readBoundingBoxEPS(const char *fileName,int *width,int *height)
*/
static bool isLeaf(ClassDef *cd)
{
- BaseClassList *bcl = cd->superClasses();
+ BaseClassList *bcl = cd->subClasses();
if (bcl->count()>0) // class has children, check their visibility
{
BaseClassListIterator bcli(*bcl);
@@ -613,7 +613,7 @@ void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path)
void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
{
//printf("addHierarchy `%s' baseClasses=%d\n",cd->name().data(),cd->baseClasses()->count());
- BaseClassListIterator bcli(*cd->superClasses());
+ BaseClassListIterator bcli(*cd->subClasses());
BaseClassDef *bcd;
for ( ; (bcd=bcli.current()) ; ++bcli )
{
@@ -673,7 +673,7 @@ void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
bn->addParent(n);
m_usedNodes->insert(bClass->name(),bn); // add node to the used list
}
- if (!bClass->visited && !hideSuper && bClass->superClasses()->count()>0)
+ if (!bClass->visited && !hideSuper && bClass->subClasses()->count()>0)
{
bool wasVisited=bClass->visited;
bClass->visited=TRUE;
@@ -698,7 +698,7 @@ DotGfxHierarchyTable::DotGfxHierarchyTable()
ClassDef *cd;
for (cli.toLast();(cd=cli.current());--cli)
{
- //printf("Trying %s superClasses=%d\n",cd->name().data(),cd->superClasses()->count());
+ //printf("Trying %s subClasses=%d\n",cd->name().data(),cd->subClasses()->count());
if (!hasVisibleRoot(cd->baseClasses()))
{
if (cd->isVisibleInHierarchy()) // root class in the graph
@@ -715,7 +715,7 @@ DotGfxHierarchyTable::DotGfxHierarchyTable()
//m_usedNodes->clear();
m_usedNodes->insert(cd->name(),n);
m_rootNodes->insert(0,n);
- if (!cd->visited && cd->superClasses()->count()>0)
+ if (!cd->visited && cd->subClasses()->count()>0)
{
addHierarchy(n,cd,cd->visited);
cd->visited=TRUE;
@@ -846,7 +846,7 @@ void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot,
void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base)
{
- BaseClassListIterator bcli(base ? *cd->baseClasses() : *cd->superClasses());
+ BaseClassListIterator bcli(base ? *cd->baseClasses() : *cd->subClasses());
BaseClassDef *bcd;
for ( ; (bcd=bcli.current()) ; ++bcli )
{
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index dc95b83..3098a0a 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -732,6 +732,7 @@ static void buildClassList(Entry *root)
cd->setTemplateArguments(root->tArgList);
cd->setProtection(root->protection);
cd->addSectionsToDefinition(root->anchors);
+
// file definition containing the class cd
cd->setBodySegment(root->bodyLine,root->endBodyLine);
cd->setBodyDef(fd);
@@ -1541,8 +1542,8 @@ void buildVarList(Entry *root)
{
if (!pScope.isEmpty() && (pcd=getClass(pScope)))
{
- Protection p = (Protection)QMAX((int)root->protection,(int)cd->protection());
- md=addVariableToClass(root,pcd,mtype,pScope,name,TRUE,indentDepth,0,p);
+ //Protection p = (Protection)QMAX((int)root->protection,(int)cd->protection());
+ md=addVariableToClass(root,pcd,mtype,pScope,name,TRUE,indentDepth,0,root->protection);
}
else // annonymous scope inside namespace or file => put variable in the global scope
{
@@ -2379,7 +2380,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
if (baseClassIsTypeDef) usedName=bi->name;
cd->insertBaseClass(baseClass,usedName,bi->prot,bi->virt,templSpec);
// add this class as super class to the base class
- baseClass->insertSuperClass(cd,bi->prot,bi->virt,templSpec);
+ baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec);
return TRUE;
}
else if (scopeOffset==0 && insertUndocumented)
@@ -2393,7 +2394,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd,
// add base class to this class
cd->insertBaseClass(baseClass,bi->name,bi->prot,bi->virt,templSpec);
// add this class as super class to the base class
- baseClass->insertSuperClass(cd,bi->prot,bi->virt,templSpec);
+ baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec);
// the undocumented base was found in this file
baseClass->insertUsedFile(root->fileName);
// add class to the list
@@ -2586,8 +2587,8 @@ static void addTodoTestBugReferences()
Definition *d=md->getClassDef();
QCString scopeName;
if (d) scopeName=d->name();
- if (d==0) d=md->getFileDef();
if (d==0) d=md->getGroupDef();
+ if (d==0) d=md->getFileDef();
// TODO: i18n this
QCString memLabel="member";
if (Config::optimizeForCFlag) memLabel="field";
@@ -2607,8 +2608,8 @@ static void addTodoTestBugReferences()
Definition *d=md->getNamespaceDef();
QCString scopeName;
if (d) scopeName=d->name();
- if (d==0) d=md->getBodyDef();
if (d==0) d=md->getGroupDef();
+ if (d==0) d=md->getFileDef();
// TODO: i18n this
QCString memLabel="member";
if (Config::optimizeForCFlag) memLabel="global";
@@ -3348,7 +3349,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl
" related=`%s'\n"
" exceptions=`%s'\n"
" isRelated=%d\n"
- " isFiend=%d\n"
+ " isFriend=%d\n"
" isFunc=%d\n\n",
namespaceName.data(),className.data(),classTempList.data(),
funcType.data(),funcName.data(),funcArgs.data(),funcTempList.data(),
@@ -4298,7 +4299,7 @@ static void buildCompleteMemberLists()
for (cli.toFirst();(cd=cli.current());++cli)
{
if (!cd->isReference() && // not an external class
- cd->superClasses()->count()==0 && // is a root of the hierarchy
+ cd->subClasses()->count()==0 && // is a root of the hierarchy
cd->baseClasses()->count()>0) // and has at least one base class
{
cd->mergeMembers();
@@ -4792,7 +4793,12 @@ static void buildPackageList(Entry *root)
PackageDef *pd=0;
if (!root->name.isEmpty() && (pd=Doxygen::packageDict.find(root->name))==0)
{
- pd = new PackageDef(root->fileName,root->startLine,root->name);
+ QCString tagName;
+ if (root->tagInfo)
+ {
+ tagName=root->tagInfo->tagName;
+ }
+ pd = new PackageDef(root->fileName,root->startLine,root->name,tagName);
Doxygen::packageDict.inSort(root->name,pd);
}
if (pd)
@@ -6207,7 +6213,9 @@ void generateOutput()
* Check/create output directorties *
**************************************************************************/
if (Config::outputDir.isEmpty())
+ {
Config::outputDir=QDir::currentDirPath();
+ }
else
{
QDir dir(Config::outputDir);
diff --git a/src/doxysearch.cpp b/src/doxysearch.cpp
index ddbdedd..c4e69b3 100644
--- a/src/doxysearch.cpp
+++ b/src/doxysearch.cpp
@@ -509,7 +509,7 @@ void generateResults(SearchResults *sr)
"</center></td></tr>\n",page+1,numPages);
printf(" <tr bgcolor=#ffffff>\n"
" <td colspan=2>\n"
- " <dl compact>\n");
+ " <table border=\"0\" cellspacing=\"2\" cellpadding=\"2\">\n");
int i;
for (i=0 ; i < resultCount && pageEntries > 0; i++)
{
@@ -526,8 +526,8 @@ void generateResults(SearchResults *sr)
readString(f,htmlName,MAXSTRLEN);
int rank=(int)(d->rank*100+0.5);
if (rank==0) rank++;
- printf(" <dt><b><font color=#%2x00%2x>%d</font></b>"
- "<dd><a href=\"%s/%s\">%s</a>\n",
+ printf(" <tr><td align=\"right\"><b><font color=#%2x00%2x>%d</font></b>"
+ "</td><td><a href=\"%s/%s\">%s</a></td></tr>\n",
rank*2+55, 255-rank*2, rank,
d->fileInfo->url, htmlName, linkName);
pageEntries--;
@@ -537,7 +537,7 @@ void generateResults(SearchResults *sr)
skipEntries--;
}
}
- printf(" </dl>\n"
+ printf(" </table>\n"
" </td>\n"
" </tr>\n"
" <tr><td colspan=2 bgcolor=\"#4040c0\"><center>&nbsp;");
diff --git a/src/doxytag.l b/src/doxytag.l
index e2f3a55..95e7cbe 100644
--- a/src/doxytag.l
+++ b/src/doxytag.l
@@ -287,7 +287,10 @@ QCString unhtmlify(const char *str)
<SearchRefName>"\" doxytag=\"" {
BEGIN( ReadRefName );
}
-<SearchRefName>"\"></a>" {
+<SearchRefName>"\"></a><a" { // HACK: avoid finding links in code fragments
+ BEGIN( Start );
+ }
+<SearchRefName>"\"></a>" { // HACK: deal with Qt code
if (nameBug)
BEGIN( Start );
else
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index a0a46d7..7955af7 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -171,8 +171,7 @@ void HtmlGenerator::startFile(const char *name,const char *title,bool external)
{
t << substituteKeywords(g_header,lastTitle);
}
- t << "<!-- Generated by Doxygen " << versionString << " on "
- << dateToString(TRUE) << " -->" << endl;
+ t << "<!-- Generated by Doxygen " << versionString << " -->" << endl;
}
void HtmlGenerator::startQuickIndexItem(const char *s,const char *l)
@@ -436,14 +435,17 @@ void HtmlGenerator::endTextLink()
t << "</a>";
}
-void HtmlGenerator::writeHtmlLink(const char *url,const char *text)
+void HtmlGenerator::startHtmlLink(const char *url)
{
t << "<a ";
if (Config::ftvHelpFlag) t << "target=\"top\" ";
t << "href=\"";
if (url) t << url;
t << "\">";
- docify(text);
+}
+
+void HtmlGenerator::endHtmlLink()
+{
t << "</a>";
}
diff --git a/src/htmlgen.h b/src/htmlgen.h
index baa73a3..14e427b 100644
--- a/src/htmlgen.h
+++ b/src/htmlgen.h
@@ -81,7 +81,8 @@ class HtmlGenerator : public OutputGenerator
const char *anchor,const char *name);
void startTextLink(const char *file,const char *anchor);
void endTextLink();
- void writeHtmlLink(const char *url,const char *text);
+ void startHtmlLink(const char *url);
+ void endHtmlLink();
void writeMailLink(const char *url);
void startTypewriter() { t << "<code>"; }
void endTypewriter() { t << "</code>"; }
@@ -172,6 +173,7 @@ class HtmlGenerator : public OutputGenerator
void writeTilde(char c) { t << "&" << c << "tilde;"; }
void writeRing(char c) { t << "&" << c << "ring;"; }
void writeSharpS() { t << "&szlig;"; }
+ void writeCCedil(char c) { t << "&" << c << "cedil;"; }
void startDescList() { t << "<dl compact><dt>" << endl; }
void endDescList() { t << "</dl>"; }
void startParamList() { startDescList(); }
diff --git a/src/index.cpp b/src/index.cpp
index 723ec79..f11fb3f 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -359,7 +359,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper)
started=TRUE;
}
//printf("Passed...\n");
- bool hasChildren = !cd->visited && !hideSuper && cd->superClasses()->count()>0;
+ bool hasChildren = !cd->visited && !hideSuper && cd->subClasses()->count()>0;
if (cd->isLinkable())
{
ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->displayName());
@@ -395,7 +395,7 @@ void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper)
//printf("Class %s at %p visited=%d\n",cd->name().data(),cd,cd->visited);
bool wasVisited=cd->visited;
cd->visited=TRUE;
- writeClassTree(ol,cd->superClasses(),wasVisited);
+ writeClassTree(ol,cd->subClasses(),wasVisited);
}
}
}
@@ -438,7 +438,7 @@ void writeClassTree(BaseClassList *cl)
if (hasFtvHelp) ftvHelp->incContentsDepth();
started=TRUE;
}
- bool hasChildren = cd->superClasses()->count()>0;
+ bool hasChildren = cd->subClasses()->count()>0;
if (cd->isLinkable())
{
if (hasHtmlHelp)
@@ -452,7 +452,7 @@ void writeClassTree(BaseClassList *cl)
}
if (hasChildren)
{
- writeClassTree(cd->superClasses());
+ writeClassTree(cd->subClasses());
}
cd->visited=TRUE;
}
@@ -492,7 +492,7 @@ void writeClassTree(ClassList *cl)
{
started=TRUE;
}
- bool hasChildren = cd->superClasses()->count()>0;
+ bool hasChildren = cd->subClasses()->count()>0;
if (cd->isLinkable())
{
if (hasHtmlHelp)
@@ -506,7 +506,7 @@ void writeClassTree(ClassList *cl)
}
if (hasChildren)
{
- writeClassTree(cd->superClasses());
+ writeClassTree(cd->subClasses());
}
cd->visited=TRUE;
}
@@ -553,7 +553,7 @@ void writeClassHierarchy(OutputList &ol)
if (hasFtvHelp) ftvHelp->incContentsDepth();
started=TRUE;
}
- bool hasChildren = !cd->visited && cd->superClasses()->count()>0;
+ bool hasChildren = !cd->visited && cd->subClasses()->count()>0;
if (cd->isLinkable())
{
ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->displayName());
@@ -586,7 +586,7 @@ void writeClassHierarchy(OutputList &ol)
}
if (hasChildren)
{
- writeClassTree(ol,cd->superClasses(),cd->visited);
+ writeClassTree(ol,cd->subClasses(),cd->visited);
cd->visited=TRUE;
}
}
@@ -610,7 +610,7 @@ int countClassHierarchy()
ClassListIterator cli(Doxygen::classList);
for ( ; cli.current(); ++cli)
{
- if (cli.current()->superClasses()->count()>0) count++;
+ if (cli.current()->subClasses()->count()>0) count++;
}
return count;
}
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 7e8cf22..cd07ac8 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -30,24 +30,24 @@
#include "dot.h"
#include "page.h"
-static QCString filterTitle(const char *s)
-{
- QCString tmp=s,result;
- uint i;for (i=0;i<tmp.length();i++)
- {
- char c=tmp.at(i);
- switch(c)
- {
- case '#': result+="\\#"; break;
- case '"': result+="\\\""; break;
- case '%': result+="\\%"; break;
- case '[': result+="{"; break;
- case ']': result+="}"; break;
- default: result+=c; break;
- }
- }
- return result;
-}
+//static QCString filterTitle(const char *s)
+//{
+// QCString tmp=s,result;
+// uint i;for (i=0;i<tmp.length();i++)
+// {
+// char c=tmp.at(i);
+// switch(c)
+// {
+// case '#': result+="\\#"; break;
+// case '"': result+="\\\""; break;
+// case '%': result+="\\%"; break;
+// case '[': result+="{"; break;
+// case ']': result+="}"; break;
+// default: result+=c; break;
+// }
+// }
+// return result;
+//}
static QCString escapeLabelName(const char *s)
{
@@ -98,6 +98,7 @@ LatexGenerator::LatexGenerator() : OutputGenerator()
//printf("LatexGenerator::LatexGenerator() insideTabbing=FALSE\n");
insideTabbing=FALSE;
firstDescItem=TRUE;
+ insidePre=FALSE;
}
LatexGenerator::~LatexGenerator()
@@ -116,6 +117,7 @@ void LatexGenerator::append(const OutputGenerator *g)
col+=((LatexGenerator *)g)->col;
insideTabbing=insideTabbing || ((LatexGenerator *)g)->insideTabbing;
firstDescItem = ((LatexGenerator *)g)->firstDescItem;
+ insidePre = insidePre || ((LatexGenerator *)g)->insidePre;
//printf("LatexGenerator::append(%s) insideTabbing=%s\n", g->getContents().data(),
// insideTabbing ? "TRUE" : "FALSE" );
}
@@ -124,6 +126,7 @@ OutputGenerator *LatexGenerator::copy()
{
LatexGenerator *result = new LatexGenerator;
result->insideTabbing=insideTabbing;
+ result->insidePre=insidePre;
return result;
}
@@ -864,7 +867,7 @@ void LatexGenerator::writeIndexItem(const char *ref,const char *fn,
//}
-void LatexGenerator::writeHtmlLink(const char *url,const char *text)
+void LatexGenerator::startHtmlLink(const char *url)
{
if (Config::pdfHyperFlag)
{
@@ -873,7 +876,10 @@ void LatexGenerator::writeHtmlLink(const char *url,const char *text)
t << "}";
}
t << "{\\tt ";
- docify(text);
+}
+
+void LatexGenerator::endHtmlLink()
+{
t << "}";
}
@@ -1026,7 +1032,7 @@ void LatexGenerator::endMemberHeader()
void LatexGenerator::startMemberDoc(const char *clname,
const char *memname,
const char *,
- const char *title)
+ const char *)
{
if (memname && memname[0]!='@')
{
@@ -1053,7 +1059,13 @@ void LatexGenerator::startMemberDoc(const char *clname,
t << "}" << endl;
}
if (Config::compactLatexFlag) t << "\\paragraph"; else t << "\\subsubsection";
- if (Config::pdfHyperFlag && title) t << "[" << filterTitle(title) << "]";
+ if (Config::pdfHyperFlag && memname)
+ {
+ t << "[";
+ escapeMakeIndexChars(this,t,memname);
+ //filterTitle(title)
+ t << "]";
+ }
t << "{\\setlength{\\rightskip}{0pt plus 5cm}";
}
@@ -1127,7 +1139,14 @@ void LatexGenerator::startSection(const char *lab,const char *,bool sub)
t << "\\hypertarget{" << lab << "}{}";
}
t << "\\";
- if (sub) t << "subsection{"; else t << "section{";
+ if (Config::compactLatexFlag)
+ {
+ if (sub) t << "subsubsection{"; else t << "subsection{";
+ }
+ else
+ {
+ if (sub) t << "subsection{"; else t << "section{";
+ }
}
void LatexGenerator::endSection(const char *lab,bool)
@@ -1200,7 +1219,6 @@ void LatexGenerator::docify(const char *str)
static bool isJapanese = theTranslator->idLanguage()=="japanese";
static bool isKorean = theTranslator->idLanguage()=="korean";
static bool isRussian = theTranslator->idLanguage()=="russian";
- static bool isGerman = theTranslator->idLanguage()=="german";
if (str)
{
const unsigned char *p=(const unsigned char *)str;
@@ -1209,159 +1227,169 @@ void LatexGenerator::docify(const char *str)
while (*p)
{
c=*p++;
- switch(c)
+ if (insidePre)
{
- case '#': t << "\\#"; break;
- case '$': t << "\\$"; break;
- case '%': t << "\\%"; break;
- case '^': t << "$^\\wedge$"; break;
- case '&': t << "\\&"; break;
- case '*': t << "$\\ast$"; break;
- case '_': t << "\\_";
- if (!insideTabbing) t << "\\-";
- break;
- case '{': t << "\\{"; break;
- case '}': t << "\\}"; break;
- case '<': t << "$<$"; break;
- case '>': t << "$>$"; break;
- case '|': t << "$|$"; break;
- case '~': t << "$\\sim$"; break;
- case '[': if (Config::pdfHyperFlag)
- t << "\\mbox{[}";
- else
- t << "[";
- break;
- case ']': if (pc=='[') t << "$\\,$";
- if (Config::pdfHyperFlag)
- t << "\\mbox{]}";
- else
- t << "]";
- break;
- case '-': if (*p=='>')
- { t << " $\\rightarrow$ "; p++; }
- else
+ switch(c)
+ {
+ case '\\': t << "\\(\\backslash\\)"; break;
+ case '{': t << "\\{"; break;
+ case '}': t << "\\}"; break;
+ default: t << (char)c; break;
+ }
+ }
+ else
+ {
+ switch(c)
+ {
+ case '#': t << "\\#"; break;
+ case '$': t << "\\$"; break;
+ case '%': t << "\\%"; break;
+ case '^': t << "$^\\wedge$"; break;
+ case '&': t << "\\&"; break;
+ case '*': t << "$\\ast$"; break;
+ case '_': t << "\\_";
+ if (!insideTabbing) t << "\\-";
+ break;
+ case '{': t << "\\{"; break;
+ case '}': t << "\\}"; break;
+ case '<': t << "$<$"; break;
+ case '>': t << "$>$"; break;
+ case '|': t << "$|$"; break;
+ case '~': t << "$\\sim$"; break;
+ case '[': if (Config::pdfHyperFlag)
+ t << "\\mbox{[}";
+ else
+ t << "[";
+ break;
+ case ']': if (pc=='[') t << "$\\,$";
+ if (Config::pdfHyperFlag)
+ t << "\\mbox{]}";
+ else
+ t << "]";
+ break;
+ case '-': if (*p=='>')
+ { t << " $\\rightarrow$ "; p++; }
+ else
{ t << (char)c; }
- break;
- case '\\': if (*p=='<')
- { t << "$<$"; p++; }
- else if (*p=='>')
+ break;
+ case '\\': if (*p=='<')
+ { t << "$<$"; p++; }
+ else if (*p=='>')
{ t << "$>$"; p++; }
- else
+ else
{ t << "$\\backslash$"; }
- break;
- case '"': if (isGerman) // " has a special meaning if German
- // - Thomas Vesper
- { t << "\\char`\\\"{}"; }
- else
- { t << (char)c; }
- break;
-
- default:
- if (isJapanese || isKorean)
- { // Japanese language uses wide characters
- if (c>=128)
- {
- t << (char)c;
- if (*p)
- {
- c = *p++;
- t << (char)c;
- }
- }
- else // ascii char => see if we can insert a hypenation hint
- {
- if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
- t << (char)c;
- }
- }
- else if (isCzech || isRussian)
- {
- if (c>=128)
- {
- t << (char)c;
- }
- else // ascii char => see if we can insert a hypenation hint
- {
- if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
- t << (char)c;
- }
- }
- else // language is other than Czech, Russian or Japanese
- {
- switch(c)
- {
- // the Latin-1 characters
- case 161: t << "!`"; break;
- case 181: t << "$\\mu$"; break;
- case 191: t << "?`"; break;
- case 192: t << "\\`{A}"; break;
- case 193: t << "\\'{A}"; break;
- case 194: t << "\\^{A}"; break;
- case 195: t << "\\~{A}"; break;
- case 196: t << "\\\"{A}"; break;
- case 197: t << "\\AA{}"; break;
- case 198: t << "\\AE{}"; break;
- case 199: t << "\\c{C}"; break;
- case 200: t << "\\`{E}"; break;
- case 201: t << "\\'{E}"; break;
- case 202: t << "\\^{E}"; break;
- case 203: t << "\\\"{E}"; break;
- case 204: t << "\\`{I}"; break;
- case 205: t << "\\'{I}"; break;
- case 206: t << "\\^{I}"; break;
- case 207: t << "\\\"{I}"; break;
- case 208: t << "D "; break; // anyone know the real code?
- case 209: t << "\\~{N}"; break;
- case 210: t << "\\`{O}"; break;
- case 211: t << "\\'{O}"; break;
- case 212: t << "\\^{O}"; break;
- case 213: t << "\\~{O}"; break;
- case 214: t << "\\\"{O}"; break;
- case 215: t << "$\\times$"; break;
- case 216: t << "\\O"; break;
- case 217: t << "\\`{U}"; break;
- case 218: t << "\\'{U}"; break;
- case 219: t << "\\^{U}"; break;
- case 220: t << "\\\"{U}"; break;
- case 221: t << "\\'{Y}"; break;
- case 223: t << "\\ss{}"; break;
- case 224: t << "\\`{a}"; break;
- case 225: t << "\\'{a}"; break;
- case 226: t << "\\^{a}"; break;
- case 227: t << "\\~{a}"; break;
- case 228: t << "\\\"{a}"; break;
- case 229: t << "\\aa{}"; break;
- case 230: t << "\\ae{}"; break;
- case 231: t << "\\c{c}"; break;
- case 232: t << "\\`{e}"; break;
- case 233: t << "\\'{e}"; break;
- case 234: t << "\\^{e}"; break;
- case 235: t << "\\\"{e}"; break;
- case 236: t << "\\`{\\i}"; break;
- case 237: t << "\\'{\\i}"; break;
- case 238: t << "\\^{\\i}"; break;
- case 239: t << "\\\"{\\i}"; break;
- case 241: t << "\\~{n}"; break;
- case 242: t << "\\`{o}"; break;
- case 243: t << "\\'{o}"; break;
- case 244: t << "\\^{o}"; break;
- case 245: t << "\\~{o}"; break;
- case 246: t << "\\\"{o}"; break;
- case 248: t << "\\o{}"; break;
- case 249: t << "\\`{u}"; break;
- case 250: t << "\\'{u}"; break;
- case 251: t << "\\^{u}"; break;
- case 252: t << "\\\"{u}"; break;
- case 253: t << "\\'{y}"; break;
- case 255: t << "\\\"{y}"; break;
- default: // normal ascii char
- {
- // see if we can insert an hyphenation hint
- if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
- t << (char)c;
- }
- }
- }
+ break;
+ case '"': { t << "\\char`\\\"{}"; }
+ break;
+
+ default:
+
+ if (isJapanese || isKorean)
+ { // Japanese language uses wide characters
+ if (c>=128)
+ {
+ t << (char)c;
+ if (*p)
+ {
+ c = *p++;
+ t << (char)c;
+ }
+ }
+ else // ascii char => see if we can insert a hypenation hint
+ {
+ if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
+ t << (char)c;
+ }
+ }
+ else if (isCzech || isRussian)
+ {
+ if (c>=128)
+ {
+ t << (char)c;
+ }
+ else // ascii char => see if we can insert a hypenation hint
+ {
+ if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
+ t << (char)c;
+ }
+ }
+ else // language is other than Czech, Russian or Japanese
+ {
+ switch(c)
+ {
+ // the Latin-1 characters
+ case 161: t << "!`"; break;
+ case 181: t << "$\\mu$"; break;
+ case 191: t << "?`"; break;
+ case 192: t << "\\`{A}"; break;
+ case 193: t << "\\'{A}"; break;
+ case 194: t << "\\^{A}"; break;
+ case 195: t << "\\~{A}"; break;
+ case 196: t << "\\\"{A}"; break;
+ case 197: t << "\\AA{}"; break;
+ case 198: t << "\\AE{}"; break;
+ case 199: t << "\\c{C}"; break;
+ case 200: t << "\\`{E}"; break;
+ case 201: t << "\\'{E}"; break;
+ case 202: t << "\\^{E}"; break;
+ case 203: t << "\\\"{E}"; break;
+ case 204: t << "\\`{I}"; break;
+ case 205: t << "\\'{I}"; break;
+ case 206: t << "\\^{I}"; break;
+ case 207: t << "\\\"{I}"; break;
+ case 208: t << "D "; break; // anyone know the real code?
+ case 209: t << "\\~{N}"; break;
+ case 210: t << "\\`{O}"; break;
+ case 211: t << "\\'{O}"; break;
+ case 212: t << "\\^{O}"; break;
+ case 213: t << "\\~{O}"; break;
+ case 214: t << "\\\"{O}"; break;
+ case 215: t << "$\\times$"; break;
+ case 216: t << "\\O"; break;
+ case 217: t << "\\`{U}"; break;
+ case 218: t << "\\'{U}"; break;
+ case 219: t << "\\^{U}"; break;
+ case 220: t << "\\\"{U}"; break;
+ case 221: t << "\\'{Y}"; break;
+ case 223: t << "\\ss{}"; break;
+ case 224: t << "\\`{a}"; break;
+ case 225: t << "\\'{a}"; break;
+ case 226: t << "\\^{a}"; break;
+ case 227: t << "\\~{a}"; break;
+ case 228: t << "\\\"{a}"; break;
+ case 229: t << "\\aa{}"; break;
+ case 230: t << "\\ae{}"; break;
+ case 231: t << "\\c{c}"; break;
+ case 232: t << "\\`{e}"; break;
+ case 233: t << "\\'{e}"; break;
+ case 234: t << "\\^{e}"; break;
+ case 235: t << "\\\"{e}"; break;
+ case 236: t << "\\`{\\i}"; break;
+ case 237: t << "\\'{\\i}"; break;
+ case 238: t << "\\^{\\i}"; break;
+ case 239: t << "\\\"{\\i}"; break;
+ case 241: t << "\\~{n}"; break;
+ case 242: t << "\\`{o}"; break;
+ case 243: t << "\\'{o}"; break;
+ case 244: t << "\\^{o}"; break;
+ case 245: t << "\\~{o}"; break;
+ case 246: t << "\\\"{o}"; break;
+ case 248: t << "\\o{}"; break;
+ case 249: t << "\\`{u}"; break;
+ case 250: t << "\\'{u}"; break;
+ case 251: t << "\\^{u}"; break;
+ case 252: t << "\\\"{u}"; break;
+ case 253: t << "\\'{y}"; break;
+ case 255: t << "\\\"{y}"; break;
+ default: // normal ascii char
+ {
+ // see if we can insert an hyphenation hint
+ if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
+ t << (char)c;
+ }
+ }
+ }
+ }
}
pc = c;
}
diff --git a/src/latexgen.h b/src/latexgen.h
index b000c27..0c6ed8e 100644
--- a/src/latexgen.h
+++ b/src/latexgen.h
@@ -78,7 +78,8 @@ class LatexGenerator : public OutputGenerator
const char *anchor,const char *text);
void startTextLink(const char *,const char *);
void endTextLink();
- void writeHtmlLink(const char *,const char *);
+ void startHtmlLink(const char *);
+ void endHtmlLink();
void writeMailLink(const char *);
void startTypewriter() { t << "{\\tt "; }
void endTypewriter() { t << "}"; }
@@ -110,8 +111,12 @@ class LatexGenerator : public OutputGenerator
void writeAnchor(const char *fileName,const char *name);
void startCodeFragment() { t << "\\footnotesize\\begin{verbatim}"; }
void endCodeFragment() { t << "\\end{verbatim}\\normalsize " << endl; }
- void startPreFragment() { t << "\\small\\begin{alltt}"; }
- void endPreFragment() { t << "\\end{alltt}\\normalsize " << endl; }
+ void startPreFragment() { t << "\\small\\begin{alltt}";
+ insidePre=TRUE;
+ }
+ void endPreFragment() { t << "\\end{alltt}\\normalsize " << endl;
+ insidePre=FALSE;
+ }
void startCodeLine() { col=0; }
void endCodeLine() { codify("\n"); }
//void writeBoldString(const char *text)
@@ -174,6 +179,7 @@ class LatexGenerator : public OutputGenerator
void writeTilde(char c) { t << "\\~{" << c << "}"; }
void writeRing(char c) { t << "\\" << c << c; }
void writeSharpS() { t << "\"s"; }
+ void writeCCedil(char c) { t << "\\c{" << c << "}"; }
void startMemberDescription() { t << "\\begin{CompactList}\\small\\item\\em "; }
void endMemberDescription() { t << "\\item\\end{CompactList}"; }
void startDescList() { t << "\\begin{Desc}\n\\item["; }
@@ -244,6 +250,7 @@ class LatexGenerator : public OutputGenerator
int col;
bool insideTabbing;
bool firstDescItem;
+ bool insidePre;
};
#endif
diff --git a/src/mangen.cpp b/src/mangen.cpp
index 63cbed0..36e2334 100644
--- a/src/mangen.cpp
+++ b/src/mangen.cpp
@@ -171,9 +171,12 @@ void ManGenerator::writeCodeLink(const char *,const char *,
docify(name);
}
-void ManGenerator::writeHtmlLink(const char *,const char *text)
+void ManGenerator::startHtmlLink(const char *)
+{
+}
+
+void ManGenerator::endHtmlLink()
{
- docify(text);
}
void ManGenerator::writeMailLink(const char *url)
diff --git a/src/mangen.h b/src/mangen.h
index 785cd75..920f1cb 100644
--- a/src/mangen.h
+++ b/src/mangen.h
@@ -76,7 +76,8 @@ class ManGenerator : public OutputGenerator
const char *anchor,const char *name);
void startTextLink(const char *,const char *) {}
void endTextLink() {}
- void writeHtmlLink(const char *url,const char *text);
+ void startHtmlLink(const char *url);
+ void endHtmlLink();
void writeMailLink(const char *url);
void startTypewriter() { t << "\\fC"; firstCol=FALSE; }
void endTypewriter() { t << "\\fR"; firstCol=FALSE; }
@@ -164,6 +165,8 @@ class ManGenerator : public OutputGenerator
void writeSharpS() { t << "s\\*:"; /* just a wild guess,
need to check! */
firstCol=FALSE; }
+ void writeCCedil(char c) { t << c; /* TODO: fix this */
+ firstCol=FALSE; }
void startMemberDescription() { t << "\n.RI \"\\fI"; firstCol=FALSE; }
void endMemberDescription() { t << "\\fR\""; firstCol=FALSE; }
void startDescList();
diff --git a/src/outputgen.h b/src/outputgen.h
index 436ebcb..06ae375 100644
--- a/src/outputgen.h
+++ b/src/outputgen.h
@@ -103,14 +103,17 @@ class BaseOutputDocInterface
virtual void writeCodeLink(const char *ref,const char *file,
const char *anchor,const char *text) = 0;
- /*! Writes a (link to an) URL found in the documentation.
- * \param url To URL to link to.
- * \param text The text to display as a placeholder for the link.
+ /*! Starts a (link to an) URL found in the documentation.
+ * \param url The URL to link to.
+ */
+ virtual void startHtmlLink(const char *url) = 0;
+
+ /*! Ends a link started by startHtmlLink().
*/
- virtual void writeHtmlLink(const char *url,const char *text) = 0;
+ virtual void endHtmlLink() = 0;
/*! Writes a (link to an) email address found in the documentation.
- * \param url To email address, this is also used for the link text.
+ * \param url The email address, this is also used for the link text.
*/
virtual void writeMailLink(const char *url) = 0;
@@ -202,6 +205,7 @@ class BaseOutputDocInterface
virtual void writeTilde(char) = 0;
virtual void writeRing(char) = 0;
virtual void writeSharpS() = 0;
+ virtual void writeCCedil(char) = 0;
virtual void startDescList() = 0;
virtual void endDescList() = 0;
virtual void startParamList() = 0;
diff --git a/src/outputlist.h b/src/outputlist.h
index 7ae1973..3a6898d 100644
--- a/src/outputlist.h
+++ b/src/outputlist.h
@@ -134,8 +134,10 @@ class OutputList : public OutputDocInterface
{ forall(&OutputGenerator::startTextLink,file,anchor); }
void endTextLink()
{ forall(&OutputGenerator::endTextLink); }
- void writeHtmlLink(const char *url,const char *text)
- { forall(&OutputGenerator::writeHtmlLink,url,text); }
+ void startHtmlLink(const char *url)
+ { forall(&OutputGenerator::startHtmlLink,url); }
+ void endHtmlLink()
+ { forall(&OutputGenerator::endHtmlLink); }
void writeMailLink(const char *url)
{ forall(&OutputGenerator::writeMailLink,url); }
void writeStartAnnoItem(const char *type,const char *file,
@@ -296,6 +298,8 @@ class OutputList : public OutputDocInterface
{ forall(&OutputGenerator::writeRing,c); }
void writeSharpS()
{ forall(&OutputGenerator::writeSharpS); }
+ void writeCCedil(char c)
+ { forall(&OutputGenerator::writeCCedil,c); }
void startMemberDescription()
{ forall(&OutputGenerator::startMemberDescription); }
void endMemberDescription()
diff --git a/src/packagedef.cpp b/src/packagedef.cpp
index 4bdedbb..4f2ae02 100644
--- a/src/packagedef.cpp
+++ b/src/packagedef.cpp
@@ -27,11 +27,12 @@
#include "language.h"
#include "doxygen.h"
-PackageDef::PackageDef(const char *df,int dl,const char *na) :
+PackageDef::PackageDef(const char *df,int dl,const char *na,const char *ref) :
Definition(df,dl,na)
{
classList = new ClassList;
packageFileName = "package_"+convertFileName(na);
+ setReference(ref);
}
PackageDef::~PackageDef()
diff --git a/src/packagedef.h b/src/packagedef.h
index 7d5224a..00c88f4 100644
--- a/src/packagedef.h
+++ b/src/packagedef.h
@@ -32,7 +32,7 @@ class OutputList;
class PackageDef : public Definition
{
public:
- PackageDef(const char *fName,int line, const char *name);
+ PackageDef(const char *fName,int line, const char *name,const char *ref=0);
~PackageDef();
DefType definitionType() { return TypePackage; }
QCString getOutputFileBase() const { return packageFileName; }
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
index 181f1a8..efae422 100644
--- a/src/rtfgen.cpp
+++ b/src/rtfgen.cpp
@@ -1317,27 +1317,30 @@ void RTFGenerator::writeIndexItem(const char *ref,const char *fn,
// t << "}{\\pageref{" << text << "}}" << endl;
//}
-void RTFGenerator::writeHtmlLink(const char *url,const char *text)
+void RTFGenerator::startHtmlLink(const char *url)
{
- if (url && Config::rtfHyperFlag)
+ if (Config::rtfHyperFlag)
{
t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
t << url;
t << "\" }{}";
t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
+ }
+ else
+ {
+ startTypewriter();
+ }
+}
- if (text)
- docify(text);
- else
- docify(url);
-
+void RTFGenerator::endHtmlLink()
+{
+ if (Config::rtfHyperFlag)
+ {
t << "}}}" << endl;
}
else
{
- startTypewriter();
- docify(text);
endTypewriter();
}
}
@@ -2264,6 +2267,16 @@ void RTFGenerator::writeRing(char c)
}
}
+void RTFGenerator::writeCCedil(char c)
+{
+ switch(c)
+ {
+ case 'C' : t << '\307'; break;
+ case 'c' : t << '\347'; break;
+ default: t << '?'; break;
+ }
+}
+
/**
* VERY brittle routine inline RTF's included by other RTF's.
* it is recursive and ugly.
diff --git a/src/rtfgen.h b/src/rtfgen.h
index 2f1355a..a40986d 100644
--- a/src/rtfgen.h
+++ b/src/rtfgen.h
@@ -78,7 +78,8 @@ class RTFGenerator : public OutputGenerator
const char *anchor,const char *text);
void startTextLink(const char *f,const char *anchor);
void endTextLink();
- void writeHtmlLink(const char *,const char *);
+ void startHtmlLink(const char *);
+ void endHtmlLink();
void writeMailLink(const char *url);
void startTypewriter() { t << "{\\f2 "; }
void endTypewriter() { t << "}"; }
@@ -159,6 +160,7 @@ class RTFGenerator : public OutputGenerator
void writeTilde(char c);
void writeRing(char c);
void writeSharpS() { t << "\337"; }
+ void writeCCedil(char c);
void startMemberDescription();
void endMemberDescription();
diff --git a/src/scanner.l b/src/scanner.l
index 5bd5c0b..ab714c5 100644
--- a/src/scanner.l
+++ b/src/scanner.l
@@ -146,6 +146,7 @@ static QStack<QCString> autoGroupNameStack;
static QCString lastDefGroup;
static bool insideFormula;
+static bool insideTryBlock=FALSE;
//-----------------------------------------------------------------------------
@@ -168,6 +169,7 @@ static void initParser()
baseVirt = Normal;
isTypedef = FALSE;
autoGroupNameStack.clear();
+ insideTryBlock = FALSE;
}
static void initEntry()
@@ -426,6 +428,7 @@ TITLE [tT][iI][tT][lL][eE]
%x SkipRound
%x SkipSquare
%x TypedefName
+%x TryFunctionBlock
%x Comment
%x Doc
%x JavaDoc
@@ -1028,7 +1031,12 @@ TITLE [tT][iI][tT][lL][eE]
{
BEGIN(IDLUnionCase);
}
- else
+ else if (insideTryBlock && strcmp(yytext,"catch")==0)
+ {
+ insideTryBlock=FALSE;
+ BEGIN(TryFunctionBlock);
+ }
+ else
{
if (YY_START==FindMembers)
{
@@ -1071,6 +1079,13 @@ TITLE [tT][iI][tT][lL][eE]
<IDLUnionCase>":" { BEGIN(FindMembers); }
<IDLUnionCase>\n { yyLineNr++; }
<IDLUnionCase>.
+<TryFunctionBlock>\n
+<TryFunctionBlock>"{" {
+ curlyCount=0;
+ lastCurlyContext = FindMembers ;
+ BEGIN( SkipCurly );
+ }
+<TryFunctionBlock>.
<EndCppQuote>")" {
insideCppQuote=FALSE;
BEGIN(FindMembers);
@@ -1551,7 +1566,9 @@ TITLE [tT][iI][tT][lL][eE]
BEGIN( FindMembers ) ;
}
else
+ {
BEGIN( MemberSpec ) ;
+ }
}
}
}
@@ -1985,6 +2002,9 @@ TITLE [tT][iI][tT][lL][eE]
current->args += ' ' ;
}
<FuncQual,FuncRound,FuncFunc>. { current->args += *yytext; }
+<FuncQual>{BN}*"try"{BN}+ { /* try-function-block */
+ insideTryBlock=TRUE;
+ }
<FuncQual>{BN}*"throw"{BN}*"(" {
current->exception = " throw (" ;
roundCount=0;
@@ -2045,7 +2065,7 @@ TITLE [tT][iI][tT][lL][eE]
//}
current->fileName = yyFileName;
current->startLine = yyLineNr;
- if (*yytext!=';' || (current_root->section&Entry::SCOPE_MASK) )
+ if (*yytext!=';' || (current_root->section&Entry::COMPOUND_MASK) )
{
int tempArg=current->name.find('<');
QCString tempName;
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
index bb9e76d..ed684c9 100644
--- a/src/tagreader.cpp
+++ b/src/tagreader.cpp
@@ -76,6 +76,18 @@ class TagNamespaceInfo
QStringList classList;
};
+/*! Container for package specific info that can be read from a tagfile */
+class TagPackageInfo
+{
+ public:
+ TagPackageInfo() { members.setAutoDelete(TRUE); }
+ QString name;
+ QString filename;
+ QStrList docAnchors;
+ QList<TagMemberInfo> members;
+ QStringList classList;
+};
+
/*! Container for file specific info that can be read from a tagfile */
class TagFileInfo
{
@@ -214,6 +226,7 @@ class TagFileParser : public QXmlDefaultHandler
}
else if (kind=="package")
{
+ m_curPackage = new TagPackageInfo;
m_state = InPackage;
}
else
@@ -235,6 +248,8 @@ class TagFileParser : public QXmlDefaultHandler
m_curGroup=0; break;
case InPage: m_tagFilePages.append(m_curPage);
m_curPage=0; break;
+ case InPackage: m_tagFilePackages.append(m_curPackage);
+ m_curPackage=0; break;
default:
err("Error: tag `compound' was not expected!\n");
}
@@ -278,6 +293,7 @@ class TagFileParser : public QXmlDefaultHandler
case InFile: m_curFile->members.append(m_curMember); break;
case InNamespace: m_curNamespace->members.append(m_curMember); break;
case InGroup: m_curGroup->members.append(m_curMember); break;
+ case InPackage: m_curPackage->members.append(m_curMember); break;
default: err("Error: Unexpected tag `member' found\n"); break;
}
}
@@ -291,6 +307,7 @@ class TagFileParser : public QXmlDefaultHandler
case InGroup: m_curGroup->docAnchors.append(m_curString); break;
case InPage: m_curPage->docAnchors.append(m_curString); break;
case InMember: m_curMember->docAnchors.append(m_curString); break;
+ case InPackage: m_curPackage->docAnchors.append(m_curString); break;
default: err("Error: Unexpected tag `member' found\n"); break;
}
}
@@ -301,6 +318,7 @@ class TagFileParser : public QXmlDefaultHandler
case InFile: m_curFile->classList.append(m_curString); break;
case InNamespace: m_curNamespace->classList.append(m_curString); break;
case InGroup: m_curGroup->classList.append(m_curString); break;
+ case InPackage: m_curPackage->classList.append(m_curString); break;
default: err("Error: Unexpected tag `class' found\n"); break;
}
}
@@ -343,6 +361,7 @@ class TagFileParser : public QXmlDefaultHandler
case InGroup: m_curGroup->name = m_curString; break;
case InPage: m_curPage->name = m_curString; break;
case InMember: m_curMember->name = m_curString; break;
+ case InPackage: m_curPackage->name = m_curString; break;
default: err("Error: Unexpected tag `name' found\n"); break;
}
}
@@ -395,6 +414,7 @@ class TagFileParser : public QXmlDefaultHandler
case InFile: m_curFile->filename = m_curString; break;
case InGroup: m_curGroup->filename = m_curString; break;
case InPage: m_curPage->filename = m_curString; break;
+ case InPackage: m_curPackage->filename = m_curString; break;
default: err("Error: Unexpected tag `filename' found\n"); break;
}
}
@@ -457,18 +477,23 @@ class TagFileParser : public QXmlDefaultHandler
bool startDocument()
{
+ m_state = Invalid;
+
m_curClass=0;
m_curNamespace=0;
m_curFile=0;
m_curGroup=0;
m_curPage=0;
- m_state = Invalid;
+ m_curPackage=0;
+
m_stateStack.setAutoDelete(TRUE);
m_tagFileClasses.setAutoDelete(TRUE);
m_tagFileFiles.setAutoDelete(TRUE);
m_tagFileNamespaces.setAutoDelete(TRUE);
m_tagFileGroups.setAutoDelete(TRUE);
m_tagFilePages.setAutoDelete(TRUE);
+ m_tagFilePackages.setAutoDelete(TRUE);
+
m_startElementHandlers.insert("compound", new StartElementHandler(this,&TagFileParser::startCompound));
m_startElementHandlers.insert("member", new StartElementHandler(this,&TagFileParser::startMember));
m_startElementHandlers.insert("name", new StartElementHandler(this,&TagFileParser::startStringValue));
@@ -485,6 +510,7 @@ class TagFileParser : public QXmlDefaultHandler
m_startElementHandlers.insert("page", new StartElementHandler(this,&TagFileParser::startStringValue));
m_startElementHandlers.insert("docanchor", new StartElementHandler(this,&TagFileParser::startStringValue));
m_startElementHandlers.insert("tagfile", new StartElementHandler(this,&TagFileParser::startIgnoreElement));
+
m_endElementHandlers.insert("compound", new EndElementHandler(this,&TagFileParser::endCompound));
m_endElementHandlers.insert("member", new EndElementHandler(this,&TagFileParser::endMember));
m_endElementHandlers.insert("name", new EndElementHandler(this,&TagFileParser::endName));
@@ -501,6 +527,7 @@ class TagFileParser : public QXmlDefaultHandler
m_endElementHandlers.insert("page", new EndElementHandler(this,&TagFileParser::endPage));
m_endElementHandlers.insert("docanchor", new EndElementHandler(this,&TagFileParser::endDocAnchor));
m_endElementHandlers.insert("tagfile", new EndElementHandler(this,&TagFileParser::endIgnoreElement));
+
return TRUE;
}
bool startElement( const QString&, const QString&,
@@ -548,11 +575,13 @@ class TagFileParser : public QXmlDefaultHandler
QList<TagNamespaceInfo> m_tagFileNamespaces;
QList<TagGroupInfo> m_tagFileGroups;
QList<TagPageInfo> m_tagFilePages;
+ QList<TagPackageInfo> m_tagFilePackages;
QDict<StartElementHandler> m_startElementHandlers;
QDict<EndElementHandler> m_endElementHandlers;
TagClassInfo *m_curClass;
TagFileInfo *m_curFile;
TagNamespaceInfo *m_curNamespace;
+ TagPackageInfo *m_curPackage;
TagGroupInfo *m_curGroup;
TagPageInfo *m_curPage;
TagMemberInfo *m_curMember;
@@ -870,6 +899,10 @@ static QString stripPath(const QString &s)
}
}
+/*! Injects the info gathered by the XML parser into the Entry tree.
+ * This tree contains the information extracted from the input in a
+ * "unrelated" form.
+ */
void TagFileParser::buildLists(Entry *root)
{
// build class list
@@ -953,6 +986,24 @@ void TagFileParser::buildLists(Entry *root)
tni = m_tagFileNamespaces.next();
}
+ // build package list
+ TagPackageInfo *tpgi = m_tagFilePackages.first();
+ while (tpgi)
+ {
+ Entry *pe = new Entry;
+ pe->section = Entry::PACKAGE_SEC;
+ pe->name = tpgi->name;
+ addDocAnchors(pe,tpgi->docAnchors);
+ TagInfo *ti = new TagInfo;
+ ti->tagName = m_tagName;
+ ti->fileName = tpgi->filename;
+ pe->tagInfo = ti;
+
+ buildMemberList(pe,tpgi->members);
+ root->addSubEntry(pe);
+ tpgi = m_tagFilePackages.next();
+ }
+
// build group list
TagGroupInfo *tgi = m_tagFileGroups.first();
while (tgi)
diff --git a/src/translator.h b/src/translator.h
index a8c1de7..59aad27 100644
--- a/src/translator.h
+++ b/src/translator.h
@@ -230,7 +230,7 @@ class Translator
// 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 "Modules"; }
@@ -591,47 +591,47 @@ class Translator
return (QCString)"Inheritance diagram for "+clName+":";
}
- /*! this text is generated when the \internal command is used. */
+ /*! this text is generated when the \\internal command is used. */
virtual QCString trForInternalUseOnly()
{ return "For internal use only."; }
- /*! this text is generated when the \reimp command is used. */
+ /*! this text is generated when the \\reimp command is used. */
virtual QCString trReimplementedForInternalReasons()
{ return "Reimplemented for internal reasons; the API is not affected."; }
- /*! this text is generated when the \warning command is used. */
+ /*! this text is generated when the \\warning command is used. */
virtual QCString trWarning()
{ return "Warning"; }
- /*! this text is generated when the \bug command is used. */
+ /*! this text is generated when the \\bug command is used. */
virtual QCString trBugsAndLimitations()
{ return "Bugs and limitations"; }
- /*! this text is generated when the \version command is used. */
+ /*! this text is generated when the \\version command is used. */
virtual QCString trVersion()
{ return "Version"; }
- /*! this text is generated when the \date command is used. */
+ /*! this text is generated when the \\date command is used. */
virtual QCString trDate()
{ return "Date"; }
- /*! this text is generated when the \author command is used. */
+ /*! this text is generated when the \\author command is used. */
virtual QCString trAuthors()
{ return "Author(s)"; }
- /*! this text is generated when the \return command is used. */
+ /*! this text is generated when the \\return command is used. */
virtual QCString trReturns()
{ return "Returns"; }
- /*! this text is generated when the \sa command is used. */
+ /*! this text is generated when the \\sa command is used. */
virtual QCString trSeeAlso()
{ return "See also"; }
- /*! this text is generated when the \param command is used. */
+ /*! this text is generated when the \\param command is used. */
virtual QCString trParameters()
{ return "Parameters"; }
- /*! this text is generated when the \exception command is used. */
+ /*! this text is generated when the \\exception command is used. */
virtual QCString trExceptions()
{ return "Exceptions"; }
@@ -1239,7 +1239,7 @@ class Translator
// new since 1.2.5
//////////////////////////////////////////////////////////////////////////
- /*! Used as a marker that is put before a \bug item */
+ /*! Used as a marker that is put before a \\bug item */
virtual QCString trBug()
{
return "Bug";
diff --git a/src/translator_de.h b/src/translator_de.h
index dca9345..1fdf217 100644
--- a/src/translator_de.h
+++ b/src/translator_de.h
@@ -638,7 +638,7 @@ class TranslatorGerman : public Translator
/*! this text is put before an include dependency graph */
virtual QCString trInclDepGraph(const char *fName)
{
- return (QCString)"Include-Abh&auml;ngikeitsdiagramm f&uuml;r "+fName+":";
+ return (QCString)"Include-Abh&auml;ngigkeitsdiagramm f&uuml;r "+fName+":";
}
/*! header that is put before the list of constructor/destructors. */
virtual QCString trConstructorDocumentation()
@@ -834,7 +834,7 @@ class TranslatorGerman : public Translator
"Die Rechtecke in obigem Graphen bedeuten:\n"
"<ul>\n"
"<li>Ein schwarz gef&uuml;lltes Rechteck stellt die Struktur oder "
- "Klasse dar, f&uuml;die der Graph erzeug wurde.\n"
+ "Klasse dar, f&uuml;r die der Graph erzeug wurde.\n"
"<li>Ein Rechteck mit schwarzem Rahmen kennzeichnet eine dokumentierte "
" Struktur oder Klasse.\n"
"<li>Ein Rechteck mit grauem Rahmen kennzeichnet eine undokumentierte "
@@ -850,10 +850,10 @@ class TranslatorGerman : public Translator
"zwischen zwei Klassen dar.\n"
"<li>Ein dunkelgr&uuml;ner Pfeil stellt gesch&uuml;tzte Vererbung dar.\n"
"<li>Ein dunkelroter Pfeil stellt private Vererbung dar.\n"
- "<li>Ein gestrichelter violetter Pfeil beutet, dass eine Klasse in einer "
+ "<li>Ein gestrichelter violetter Pfeil bedeutet, dass eine Klasse in einer "
"anderen enthalten ist oder von einer anderen benutzt wird. Am Pfeil "
"stehen die Variable(n), mit deren Hilfe auf die Struktur oder Klasse "
- "an der Pfeilspize zugegriffen werden kann. \n"
+ "an der Pfeilspitze zugegriffen werden kann. \n"
"</ul>\n";
}
/*! text for the link to the legend page */
diff --git a/src/translator_fr.h b/src/translator_fr.h
index e7809b5..ce356ce 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -31,6 +31,12 @@ class TranslatorFrench : public Translator
QCString latexBabelPackage()
{ return "french"; }
+ /*! return the language charset. This will be used for the HTML output */
+ virtual QCString idLanguageCharset()
+ {
+ return "iso-8859-1";
+ }
+
/*! used in the compound documentation before a list of related functions. */
QCString trRelatedFunctions()
{ return "Fonctions associées"; }