Commit f1ddf16a authored by dimitri's avatar dimitri

Release-1.4.7-20060809

parent 3a7dcb4c
DOXYGEN Version 1.4.7-20060716
DOXYGEN Version 1.4.7-20060809
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (16 July 2006)
Dimitri van Heesch (09 August 2006)
......@@ -24,6 +24,7 @@ distclean: clean
cd addon/doxmlparser/src ; $(MAKE) distclean
cd addon/doxmlparser/test ; $(MAKE) distclean
cd addon/doxmlparser/examples/metrics ; $(MAKE) distclean
cd addon/doxyapp ; $(MAKE) distclean
-rm -f lib/lib*
-rm -f bin/doxy*
-rm -f html
......
DOXYGEN Version 1.4.7_20060716
DOXYGEN Version 1.4.7_20060809
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) (16 July 2006)
Dimitri van Heesch (dimitri@stack.nl) (09 August 2006)
all clean depend: Makefile.doxyapp
$(MAKE) -f Makefile.doxyapp $@
distclean: clean
$(RM) -rf Makefile doxyapp.pro Makefile.doxyapp
tmake:
$(ENV) $(PERL) $(TMAKE) doxyapp.pro >Makefile.doxyapp
strip:
strip doxyapp
Makefile.doxyapp: doxyapp.pro
$(ENV) $(PERL) $(TMAKE) doxyapp.pro >Makefile.doxyapp
install:
This directory contains an example of how to use doxygen as
an "source parsing engine" in an application. It shows how to configure doxygen
from the application and shows how to run doxygen without generating output,
and then uses the information about the symbols found in the source code.
Note that if you use this approach your application should be licensed under the GPL.
/******************************************************************************
*
* Copyright (C) 1997-2006 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.
*
* Documents produced by Doxygen are derivative works derived from the
* input used in their production; they are not affected by this license.
*
*/
/** @file
* @brief Example of how to use doxygen as part of another GPL applications
*
* This example shows how to configure and run doxygen programmatically from
* within an application without generating the usual output.
* The example should work on any Unix like OS (including Linux and Mac OS X).
*
* This example shows how to use to code parser to get cross-references information
* and it also shows how to look up symbols in a program parsed by doxygen and
* show some information about it.
*/
#include </usr/include/unistd.h> // ugly hack to get the right unistd.h (doxygen has one too)
#include "doxygen.h"
#include "outputgen.h"
#include "parserintf.h"
class XRefDummyCodeGenerator : public CodeOutputInterface
{
public:
XRefDummyCodeGenerator(FileDef *fd) : m_fd(fd) {}
~XRefDummyCodeGenerator() {}
// these are just null functions, they can be used to produce a syntax highlighted
// and cross-linked version of the source code, but who needs that anyway ;-)
void codify(const char *) {}
void writeCodeLink(const char *,const char *,const char *,const char *) {}
void startCodeLine() {}
void endCodeLine() {}
void startCodeAnchor(const char *) {}
void endCodeAnchor() {}
void startFontClass(const char *) {}
void endFontClass() {}
void writeCodeAnchor(const char *) {}
void writeLineNumber(const char *,const char *,const char *,int) {}
// here we are presented with the symbols found by the code parser
void linkableSymbol(int l, const char *sym,Definition *symDef,Definition *context)
{
QCString ctx;
if (context) // the context of the symbol is known
{
if (context->definitionType()==Definition::TypeMember) // it is inside a member
{
Definition *parentContext = context->getOuterScope();
if (parentContext && parentContext->definitionType()==Definition::TypeClass)
// it is inside a member of a class
{
ctx.sprintf("inside %s %s of %s %s",
((MemberDef *)context)->memberTypeName().data(),
context->name().data(),
((ClassDef*)parentContext)->compoundTypeString().data(),
parentContext->name().data());
}
else if (parentContext==Doxygen::globalScope) // it is inside a global member
{
ctx.sprintf("inside %s %s",
((MemberDef *)context)->memberTypeName().data(),
context->name().data());
}
}
if (ctx.isEmpty()) // it is something else (class, or namespace member, ...)
{
ctx.sprintf("in %s",context->name().data());
}
}
printf("Found symbol %s at line %d of %s %s\n",
sym,l,m_fd->getDefFileName().data(),ctx.data());
if (symDef && context) // in this case the definition of the symbol is
// known to doxygen.
{
printf("-> defined at line %d of %s\n",
symDef->getDefLine(),symDef->getDefFileName().data());
}
}
private:
FileDef *m_fd;
};
static void findXRefSymbols(FileDef *fd)
{
// get the interface to a parser that matches the file extension
ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension());
// reset the parsers state
pIntf->resetCodeParserState();
// create a new backend object
XRefDummyCodeGenerator *xrefGen = new XRefDummyCodeGenerator(fd);
// parse the source code
pIntf->parseCode(*xrefGen,
0,
fileToString(fd->absFilePath()),
FALSE,
0,
fd);
// dismiss the object.
delete xrefGen;
}
static void listSymbol(Definition *d)
{
if (d!=Doxygen::globalScope && // skip the global namespace symbol
d->name().at(0)!='@' // skip anonymous stuff
)
{
printf("%s\n",
d->name().data());
}
}
static void listSymbols()
{
QDictIterator<DefinitionIntf> sli(*Doxygen::symbolMap);
DefinitionIntf *di;
for (sli.toFirst();(di=sli.current());++sli)
{
if (di->definitionType()==DefinitionIntf::TypeSymbolList) // list of symbols
// with same name
{
DefinitionListIterator dli(*(DefinitionList*)di);
Definition *d;
// for each symbol
for (dli.toFirst();(d=dli.current());++dli)
{
listSymbol(d);
}
}
else // single symbol
{
listSymbol((Definition*)di);
}
}
}
static void lookupSymbol(Definition *d)
{
if (d!=Doxygen::globalScope && // skip the global namespace symbol
d->name().at(0)!='@' // skip anonymous stuff
)
{
printf("Symbol info\n");
printf("-----------\n");
printf("Name: %s\n",d->name().data());
printf("File: %s\n",d->getDefFileName().data());
printf("Line: %d\n",d->getDefLine());
// depending on the definition type we can case to the appropriate
// derived to get additional information
switch (d->definitionType())
{
case Definition::TypeClass:
{
ClassDef *cd = (ClassDef *)d;
printf("Kind: %s\n",cd->compoundTypeString().data());
}
break;
case Definition::TypeFile:
{
FileDef *fd = (FileDef *)d;
printf("Kind: File: #includes %d other files\n",
fd->includeFileList() ? fd->includeFileList()->count() : 0);
}
break;
case Definition::TypeNamespace:
{
NamespaceDef *nd = (NamespaceDef *)d;
printf("Kind: Namespace: contains %d classes and %d namespaces\n",
nd->getClassSDict() ? nd->getClassSDict()->count() : 0,
nd->getNamespaceSDict() ? nd->getNamespaceSDict()->count() : 0);
}
break;
case Definition::TypeMember:
{
MemberDef *md = (MemberDef *)d;
printf("Kind: %s\n",md->memberTypeName().data());
}
break;
default:
// ignore groups/pages/packages/dirs for now
break;
}
}
}
static void lookupSymbols(const QCString &sym)
{
if (!sym.isEmpty())
{
DefinitionIntf *di = Doxygen::symbolMap->find(sym);
if (di)
{
if (di->definitionType()==DefinitionIntf::TypeSymbolList)
{
DefinitionListIterator dli(*(DefinitionList*)di);
Definition *d;
// for each symbol with the given name
for (dli.toFirst();(d=dli.current());++dli)
{
lookupSymbol(d);
}
}
else
{
lookupSymbol((Definition*)di);
}
}
else
{
printf("Unknown symbol\n");
}
}
}
int main(int argc,char **argv)
{
char cmd[256];
if (argc<2)
{
printf("Usage: %s [source_file | source_dir]\n",argv[0]);
exit(1);
}
// initialize data structures
initDoxygen();
// setup the non-default configuration options
// we need a place to put intermediate files
Config_getString("OUTPUT_DIRECTORY")="/tmp/doxygen";
// disable html output
Config_getBool("GENERATE_HTML")=FALSE;
// disable latex output
Config_getBool("GENERATE_LATEX")=FALSE;
// be quiet
Config_getBool("QUIET")=TRUE;
// turn off warnings
Config_getBool("WARNINGS")=FALSE;
Config_getBool("WARN_IF_UNDOCUMENTED")=FALSE;
Config_getBool("WARN_IF_DOC_ERROR")=FALSE;
// Extract as much as possible
Config_getBool("EXTRACT_ALL")=TRUE;
Config_getBool("EXTRACT_STATIC")=TRUE;
Config_getBool("EXTRACT_PRIVATE")=TRUE;
Config_getBool("EXTRACT_LOCAL_METHODS")=TRUE;
// Extract source browse information, needed
// to make doxygen gather the cross reference info
Config_getBool("SOURCE_BROWSER")=TRUE;
// set the input
Config_getList("INPUT").append(argv[1]);
// check and finialize the configuration
checkConfiguration();
// parse the files
parseInput();
// iterate over the input files
FileNameListIterator fnli(Doxygen::inputNameList);
FileName *fn;
// foreach file with a certain name
for (fnli.toFirst();(fn=fnli.current());++fnli)
{
FileNameIterator fni(*fn);
FileDef *fd;
// for each file definition
for (;(fd=fni.current());++fni)
{
// get the references (linked and unlinked) found in this file
findXRefSymbols(fd);
}
}
// clean up after us
rmdir("/tmp/doxygen");
while (1)
{
printf("> Type a symbol name or\n> .list for a list of symbols or\n> .quit to exit\n> ");
fgets(cmd,256,stdin);
QCString s(cmd);
if (s.at(s.length()-1)=='\n') s=s.left(s.length()-1); // strip trailing \n
if (s==".list")
listSymbols();
else if (s==".quit")
exit(0);
else
lookupSymbols(s);
}
}
TEMPLATE = app.t
CONFIG = console warn_on debug
HEADERS =
SOURCES = doxyapp.cpp
LIBS += -L../../lib -L../../lib -ldoxygen -lqtools -lmd5 -ldoxycfg -lpng
DESTDIR =
OBJECTS_DIR = ../../objects
TARGET = ../../bin/doxyapp
INCLUDEPATH += ../../qtools ../../src
DEPENDPATH += ../../src
TARGETDEPS = ../../lib/libdoxygen.a
......@@ -47,6 +47,7 @@ QCString getResourcePath()
return result;
}
#if 0
#define GRAPHVIZ_PATH "/Applications/Graphviz.app"
#define DOT_PATH GRAPHVIZ_PATH "/Contents/MacOS"
#define DOT_LOCATION DOT_PATH "/dot"
......@@ -73,6 +74,12 @@ void setDotPath()
//Config_getBool("HAVE_DOT")=TRUE;
}
}
#endif
void setDotPath()
{
Config_getString("DOT_PATH")=getResourcePath();
}
#endif
......@@ -512,7 +519,12 @@ Step4::Step4(QWidget *parent) : QWidget(parent,"Step4")
dotGroup->setButton(0);
m_dotOptions->setEnabled(FALSE);
gbox->addWidget(w,4,0);
#if defined(Q_OS_MACX) // we bundle dot with the mac package
m_diagramMode->setButton(2);
#else
m_diagramMode->setButton(1);
#endif
layout->addWidget(m_diagramMode);
layout->addStretch(1);
......@@ -678,6 +690,7 @@ MainWidget::MainWidget(QWidget *parent)
// initialize config settings
Config::instance()->init();
Config::instance()->check();
Config_getBool("HAVE_DOT")=TRUE;
#if defined(Q_OS_MACX)
setDotPath();
#endif
......@@ -887,8 +900,8 @@ void MainWidget::launchWizard()
// -------- Initialize the dialog ----------------
// step1
wizard.setProjectName(Config_getString("PROJECT_NAME"));
wizard.setProjectNumber(Config_getString("PROJECT_NUMBER"));
wizard.setProjectName(QString::fromLocal8Bit(Config_getString("PROJECT_NAME")));
wizard.setProjectNumber(QString::fromLocal8Bit(Config_getString("PROJECT_NUMBER")));
if (Config_getList("INPUT").count()>0)
{
QString dirName=Config_getList("INPUT").getFirst();
......@@ -899,7 +912,7 @@ void MainWidget::launchWizard()
}
}
wizard.setRecursiveScan(Config_getBool("RECURSIVE"));
wizard.setDestinationDir(Config_getString("OUTPUT_DIRECTORY"));
wizard.setDestinationDir(QString::fromLocal8Bit(Config_getString("OUTPUT_DIRECTORY")));
// step2
wizard.setExtractAll(Config_getBool("EXTRACT_ALL"));
......@@ -979,12 +992,12 @@ void MainWidget::launchWizard()
// -------- Store the results ----------------
// step1
Config_getString("PROJECT_NAME")=wizard.getProjectName();
Config_getString("PROJECT_NAME")=wizard.getProjectName().local8Bit();
Config_getString("PROJECT_NUMBER")=wizard.getProjectNumber();
Config_getList("INPUT").clear();
Config_getList("INPUT").append(wizard.getSourceDir());
Config_getBool("RECURSIVE")=wizard.scanRecursively();
Config_getString("OUTPUT_DIRECTORY")=wizard.getDestinationDir();
Config_getString("OUTPUT_DIRECTORY")=wizard.getDestinationDir().local8Bit();
// step2
if (wizard.extractAll())
......@@ -1125,7 +1138,7 @@ void MainWidget::loadConfigFromFile(const QString &fn)
else
{
Config::instance()->convertStrToVal();
#if defined(Q_OS_MACX)
#if 0 //defined(Q_OS_MACX)
if (checkIfDotInstalled() &&
qstricmp(Config_getString("DOT_PATH"),DOT_PATH)!=0
)
......@@ -1163,9 +1176,9 @@ void MainWidget::launchExpert()
Expert expert(this);
expert.init();
expert.exec();
#if defined(Q_OS_MACX)
setDotPath();
#endif
//#if defined(Q_OS_MACX)
// setDotPath();
//#endif
if (expert.hasChanged()) setConfigSaved(FALSE);
}
......
......@@ -6,6 +6,7 @@ class QObject;
class IInput
{
public:
virtual ~IInput() {}
virtual void init() = 0;
virtual void setEnabled(bool) = 0;
virtual QObject *qobject() = 0;
......
......@@ -20,7 +20,7 @@ doxygen_version_minor=4
doxygen_version_revision=7
#NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
doxygen_version_mmn=20060716
doxygen_version_mmn=20060809
bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
......@@ -34,6 +34,7 @@ f_prefix=/usr/local
f_insttool=NO
f_english=NO
f_wizard=NO
f_app=NO
f_thread=NO
f_langs=nl,se,cz,fr,id,it,de,jp,je,es,fi,ru,hr,pl,pt,hu,kr,ke,ro,si,cn,no,br,dk,sk,ua,gr,tw,sr,ca,lt,za,ar,fa
......@@ -81,6 +82,9 @@ while test -n "$1"; do
--with-doxywizard | -with-doxywizard)
f_wizard=YES
;;
--with-doxyapp | -with-doxyapp)
f_app=YES
;;
-h | -help | --help)
f_help=y
;;
......@@ -521,7 +525,7 @@ TMAKE_CXXFLAGS += -DENGLISH_ONLY
EOF
fi
f_inmakefiles="Makefile.in qtools/Makefile.in src/Makefile.in examples/Makefile.in doc/Makefile.in addon/doxywizard/Makefile.in addon/doxmlparser/src/Makefile.in addon/doxmlparser/test/Makefile.in addon/doxmlparser/examples/metrics/Makefile.in libpng/Makefile.in libmd5/Makefile.in"
f_inmakefiles="Makefile.in qtools/Makefile.in src/Makefile.in examples/Makefile.in doc/Makefile.in addon/doxywizard/Makefile.in addon/doxmlparser/src/Makefile.in addon/doxmlparser/test/Makefile.in addon/doxmlparser/examples/metrics/Makefile.in libpng/Makefile.in libmd5/Makefile.in addon/doxyapp/Makefile.in"
for i in $f_inmakefiles ; do
SRC=$i
......@@ -544,6 +548,9 @@ EOF
if test $f_wizard = YES; then
echo " \$(MAKE) -C addon/doxywizard" >> $DST
fi
if test $f_app = YES; then
echo " \$(MAKE) -C addon/doxyapp" >> $DST
fi
echo "" >> $DST
echo "doxywizard_install:" >> $DST
if test $f_wizard = YES; then
......@@ -555,7 +562,7 @@ EOF
echo " Created $DST from $SRC..."
done
f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in src/doxytag.pro.in addon/doxywizard/doxywizard.pro.in addon/doxmlparser/src/doxmlparser.pro.in addon/doxmlparser/test/xmlparse.pro.in addon/doxmlparser/examples/metrics/metrics.pro.in libpng/libpng.pro.in libmd5/libmd5.pro.in"
f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in src/doxytag.pro.in addon/doxywizard/doxywizard.pro.in addon/doxmlparser/src/doxmlparser.pro.in addon/doxmlparser/test/xmlparse.pro.in addon/doxmlparser/examples/metrics/metrics.pro.in libpng/libpng.pro.in libmd5/libmd5.pro.in addon/doxyapp/doxyapp.pro.in"
for i in $f_inprofiles ; do
SRC=$i
......
This diff is collapsed.
This diff is collapsed.
......@@ -25,10 +25,11 @@ class CodeOutputInterface;
class FileDef;
class MemberDef;
extern void parseCCode(CodeOutputInterface &,const char *,const QCString &,
void parseCCode(CodeOutputInterface &,const char *,const QCString &,
bool ,const char *,FileDef *fd=0,
int startLine=-1,int endLine=-1,bool inlineFragment=FALSE,
MemberDef *memberDef=0);
extern void resetCCodeParserState();
void resetCCodeParserState();
void codeFreeScanner();
#endif
......@@ -106,6 +106,7 @@ static int g_lastCContext;
static bool g_insideObjC;
static bool g_insideProtocolList;
static bool g_lexInit = FALSE;
// context for an Objective-C method call
struct ObjCCallCtx
......@@ -458,7 +459,6 @@ static void startCodeLine()
Definition *d = g_sourceFileDef->getSourceDefinition(g_yyLineNr);
//printf("startCodeLine %d d=%s\n", g_yyLineNr,d ? d->name().data() : "<null>");
//g_code->startLineNumber();
if (!g_includeCodeFragment && d)
{
g_currentDefinition = d;
......@@ -498,10 +498,8 @@ static void startCodeLine()
}
else
{
//g_code->codify(lineNumber);
g_code->writeLineNumber(0,0,0,g_yyLineNr);
}
//g_code->endLineNumber();
}
g_code->startCodeLine();
if (g_currentFontClass)
......@@ -764,15 +762,20 @@ static MemberDef *setCallContextForVar(const QCString &name)
static void addDocCrossReference(MemberDef *src,MemberDef *dst)
{
static bool referencedByRelation = Config_getBool("REFERENCED_BY_RELATION");
static bool referencesRelation = Config_getBool("REFERENCES_RELATION");
static bool callerGraph = Config_getBool("CALLER_GRAPH");
static bool callGraph = Config_getBool("CALL_GRAPH");
if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
//printf("addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
if ((Config_getBool("REFERENCED_BY_RELATION") || Config_getBool("CALLER_GRAPH")) &&
if ((referencedByRelation || callerGraph) &&
(src->isFunction() || src->isSlot())
)
{
dst->addSourceReferencedBy(src);
}
if ((Config_getBool("REFERENCES_RELATION") || Config_getBool("CALL_GRAPH")) &&
if ((referencesRelation || callGraph) &&
(src->isFunction() || src->isSlot())
)
{
......@@ -828,6 +831,8 @@ static bool getLinkInScope(const QCString &c, // scope
}
//printf("d->getReference()=`%s' d->getOutputBase()=`%s' name=`%s' member name=`%s'\n",d->getReference().data(),d->getOutputFileBase().data(),d->name().data(),md->name().data());
ol.linkableSymbol(g_yyLineNr,md->name(),md,
g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(ol,md->getReference(),
md->getOutputFileBase(),
md->anchor(),
......@@ -936,6 +941,8 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
g_anchorCount++;
}
}
ol.linkableSymbol(g_yyLineNr,cd->name(),cd,
g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),0,clName);
addToSearchIndex(className);
if (md)
......@@ -977,6 +984,8 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
//printf("is a global md=%p g_currentDefinition=%s\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>");
if (md->isLinkable())
{
ol.linkableSymbol(g_yyLineNr,md->name(),md,
g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),clName);
addToSearchIndex(clName);
if (g_currentMemberDef)
......@@ -989,6 +998,8 @@ static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
}
// nothing found, just write out the word
ol.linkableSymbol(g_yyLineNr,clName,0,
g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
codifyLines(clName);
addToSearchIndex(clName);
}
......@@ -1044,6 +1055,8 @@ static bool generateClassMemberLink(CodeOutputInterface &ol,ClassDef *mcd,const
}
// write the actual link
ol.linkableSymbol(g_yyLineNr,xmd->name(),xmd,
g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(ol,xmd->getReference(),
xmd->getOutputFileBase(),xmd->anchor(),memName);
addToSearchIndex(memName);
......@@ -1149,6 +1162,9 @@ static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName,
}
}
}
// nothing found -> write result as is
ol.linkableSymbol(g_yyLineNr,memName,0,
g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
codifyLines(memName);
addToSearchIndex(memName);
return;
......@@ -1331,6 +1347,8 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
{
if (ctx->method && ctx->method->isLinkable())
{
g_code->linkableSymbol(g_yyLineNr,ctx->method->name(),ctx->method,
g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(*g_code,
ctx->method->getReference(),
ctx->method->getOutputFileBase(),
......@@ -1343,6 +1361,8 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
}
else
{
g_code->linkableSymbol(g_yyLineNr,pName->data(),0,
g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
codifyLines(pName->data());
}
}
......@@ -1414,6 +1434,8 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
}
else if (ctx->objectVar && ctx->objectVar->isLinkable()) // object is class variable
{
g_code->linkableSymbol(g_yyLineNr,ctx->objectVar->name(),ctx->objectVar,
g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(*g_code,
ctx->objectVar->getReference(),
ctx->objectVar->getOutputFileBase(),
......@@ -1430,6 +1452,8 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
) // object is class name
{
ClassDef *cd = ctx->objectType;
g_code->linkableSymbol(g_yyLineNr,cd->name(),cd,
g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(*g_code,
cd->getReference(),
cd->getOutputFileBase(),
......@@ -1443,6 +1467,8 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
if (cd && cd->isLinkable())
{
if (ctx->objectType==0) ctx->objectType=cd;
g_code->linkableSymbol(g_yyLineNr,cd->name(),cd,
g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
writeMultiLineCodeLink(*g_code,
cd->getReference(),
cd->getOutputFileBase(),
......@@ -1451,6 +1477,8 @@ static void writeObjCMethodCall(ObjCCallCtx *ctx)
}
else
{
g_code->linkableSymbol(g_yyLineNr,pObject->data(),0,
g_currentMemberDef ? g_currentMemberDef : g_currentDefinition);
codifyLines(pObject->data());
}
}
......@@ -1708,6 +1736,9 @@ OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
g_theVarContext.addVariable(g_parmType,g_parmName);
g_parmType.resize(0);g_parmName.resize(0);
}
<ObjCMethod,ObjCParams,ObjCParamType>{ID} {
generateClassOrGlobalLink(*g_code,yytext);
}
<ObjCMethod,ObjCParams,ObjCParamType>. {
g_code->codify(yytext);
}
......@@ -1811,6 +1842,7 @@ OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
g_inClass=FALSE;
//fprintf(stderr,"g_bodyCurlyCount=%d\n",g_bodyCurlyCount);
if (--g_bodyCurlyCount<=0)
{
g_insideBody=FALSE;
......@@ -2232,6 +2264,8 @@ OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
{
if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext))
{
g_code->linkableSymbol(g_yyLineNr,yytext,0,
g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
g_code->codify(yytext);
addToSearchIndex(yytext);
}
......@@ -2239,6 +2273,8 @@ OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
}
else
{
g_code->linkableSymbol(g_yyLineNr,yytext,0,
g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
g_code->codify(yytext);
addToSearchIndex(yytext);
g_name.resize(0);
......@@ -2260,6 +2296,8 @@ OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
//fprintf(stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getClass());
if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext))
{
g_code->linkableSymbol(g_yyLineNr,yytext,0,
g_currentMemberDef?g_currentMemberDef:g_currentDefinition);
g_code->codify(yytext);
addToSearchIndex(yytext);
}
......@@ -3140,6 +3178,7 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s,
codeYYrestart( codeYYin );
BEGIN( Body );
codeYYlex();
g_lexInit=TRUE;
if (g_needsTermination)
{
endFontClass();
......@@ -3154,11 +3193,23 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s,
return;
}
void codeFreeScanner()
{
#if defined(YY_FLEX_SUBMINOR_VERSION)
if (g_lexInit)
{
codeYYlex_destroy();
}
#endif
}
#if !defined(YY_FLEX_SUBMINOR_VERSION)
extern "C" { // some bogus code to keep the compiler happy
void codeYYdummy() { yy_flex_realloc(0,0); }
}
#elif YY_FLEX_SUBMINOR_VERSION<33
#error "You seem to be using a version of flex newer than 2.5.4. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)."
#error "You seem to be using a version of flex newer than 2.5.4 but older than 2.5.33. These versions do NOT work with doxygen! Please use version <=2.5.4 or >=2.5.33 or expect things to be parsed wrongly!"
#endif
......@@ -2329,8 +2329,8 @@ void openGroup(Entry *e,const char *,int)
if (e->section==Entry::GROUPDOC_SEC) // auto group
{
g_autoGroupStack.push(new Grouping(e->name,e->groupingPri()));
printf("==> openGroup(name=%s,sec=%x) g_autoGroupStack=%d\n",
e->name.data(),e->section,g_autoGroupStack.count());
//printf("==> openGroup(name=%s,sec=%x) g_autoGroupStack=%d\n",
// e->name.data(),e->section,g_autoGroupStack.count());
}
else // start of a member group
{
......@@ -2352,8 +2352,8 @@ void openGroup(Entry *e,const char *,int)
void closeGroup(Entry *e,const char *fileName,int)
{
printf("==> closeGroup(name=%s,sec=%x) g_autoGroupStack=%d\n",
e->name.data(),e->section,g_autoGroupStack.count());
//printf("==> closeGroup(name=%s,sec=%x) g_autoGroupStack=%d\n",
// e->name.data(),e->section,g_autoGroupStack.count());
if (g_memberGroupId!=DOX_NOGROUP) // end of member group
{
MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(g_memberGroupId);
......@@ -2372,7 +2372,7 @@ void closeGroup(Entry *e,const char *fileName,int)
{
Grouping *grp = g_autoGroupStack.pop();
e->groups->removeLast();
printf("Removing %s\n",grp->groupname.data());
//printf("Removing %s\n",grp->groupname.data());
delete grp;
initGroupInfo(e);
}
......@@ -2386,9 +2386,9 @@ void initGroupInfo(Entry *e)
e->relates = g_memberGroupRelates;
if (!g_autoGroupStack.isEmpty())
{
printf("Appending group %s to %s: count=%d entry=%p\n",
g_autoGroupStack.top()->groupname.data(),
e->name.data(),e->groups->count(),e);
//printf("Appending group %s to %s: count=%d entry=%p\n",
// g_autoGroupStack.top()->groupname.data(),
// e->name.data(),e->groups->count(),e);
e->groups->append(new Grouping(*g_autoGroupStack.top()));
}
}
......
......@@ -1196,6 +1196,27 @@ void Config::check()
annotationFromBrief.append("an");
annotationFromBrief.append("the");
}
if (Config_getBool("CALL_GRAPH") &&
(!Config_getBool("SOURCE_BROWSER") || !Config_getBool("REFERENCES_RELATION"))
)
{
config_err("Warning: turning on CALL_GRAPH requires turning "
"SOURCE_BROWSER and\nREFERENCES_RELATION on as well!\n"
"Assuming SOURCE_BROWSER=YES and REFERENCES_RELATION=YES\n");
Config_getBool("SOURCE_BROWSER")=TRUE;
Config_getBool("REFERENCES_RELATION")=TRUE;
}
if (Config_getBool("CALLER_GRAPH") &&
(!Config_getBool("SOURCE_BROWSER") || !Config_getBool("REFERENCED_BY_RELATION"))
)
{
config_err("Warning: turning on CALLER_GRAPH requires turning "
"SOURCE_BROWSER and\nREFERENCEDBY_RELATION on as well!\n"
"Assuming SOURCE_BROWSER=YES and REFERENCED_BY_RELATION=YES\n");
Config_getBool("SOURCE_BROWSER")=TRUE;
Config_getBool("REFERENCED_BY_RELATION")=TRUE;
}
}
void Config::init()
......
......@@ -313,7 +313,7 @@ void generateDEFClassSection(ClassDef *cd,
MemberList *ml,
const char *kind)
{
if (cd && ml->count()>0)
if (cd && ml && ml->count()>0)
{
t << " cp-section = {" << endl;
t << " sec-kind = '" << kind << "';" << endl;
......@@ -408,54 +408,41 @@ void generateDEFForClass(ClassDef *cd,QTextStream &t)
}
}
int numMembers =
(cd->pubTypes ? cd->pubTypes->count() : 0)+
(cd->pubMethods ? cd->pubMethods->count() : 0)+
(cd->pubAttribs ? cd->pubAttribs->count() : 0)+
(cd->pubSlots ? cd->pubSlots->count() : 0)+
(cd->signals ? cd->signals->count() : 0)+
(cd->dcopMethods ? cd->dcopMethods->count() : 0)+
(cd->pubStaticMethods ? cd->pubStaticMethods->count() : 0)+
(cd->pubStaticAttribs ? cd->pubStaticAttribs->count() : 0)+
(cd->proTypes ? cd->proTypes->count() : 0)+
(cd->proMethods ? cd->proMethods->count() : 0)+
(cd->proAttribs ? cd->proAttribs->count() : 0)+
(cd->proSlots ? cd->proSlots->count() : 0)+
(cd->proStaticMethods ? cd->proStaticMethods->count() : 0)+
(cd->proStaticAttribs ? cd->proStaticAttribs->count() : 0)+
(cd->priTypes ? cd->priTypes->count() : 0)+
(cd->priMethods ? cd->priMethods->count() : 0)+
(cd->priAttribs ? cd->priAttribs->count() : 0)+
(cd->priSlots ? cd->priSlots->count() : 0)+
(cd->priStaticMethods ? cd->priStaticMethods->count() : 0)+
(cd->priStaticAttribs ? cd->priStaticAttribs->count() : 0)+
(cd->friends ? cd->friends->count() : 0)+
(cd->related ? cd->related->count() : 0);
int numMembers = 0;
QListIterator<MemberList> mli(cd->getMemberLists());
MemberList *ml;
for (mli.toFirst();(ml=mli.current());++mli)
{
if ((ml->listType()&MemberList::detailedLists)==0)
{
numMembers+=ml->count();
}
}
if (numMembers>0)
{
generateDEFClassSection(cd,t,cd->pubTypes,"public-type");
generateDEFClassSection(cd,t,cd->pubMethods,"public-func");
generateDEFClassSection(cd,t,cd->pubAttribs,"public-attrib");
generateDEFClassSection(cd,t,cd->pubSlots,"public-slot");
generateDEFClassSection(cd,t,cd->signals,"signal");
generateDEFClassSection(cd,t,cd->dcopMethods,"dcop-func");
generateDEFClassSection(cd,t,cd->properties,"property");
generateDEFClassSection(cd,t,cd->pubStaticMethods,"public-static-func");
generateDEFClassSection(cd,t,cd->pubStaticAttribs,"public-static-attrib");
generateDEFClassSection(cd,t,cd->proTypes,"protected-type");
generateDEFClassSection(cd,t,cd->proMethods,"protected-func");
generateDEFClassSection(cd,t,cd->proAttribs,"protected-attrib");
generateDEFClassSection(cd,t,cd->proSlots,"protected-slot");
generateDEFClassSection(cd,t,cd->proStaticMethods,"protected-static-func");
generateDEFClassSection(cd,t,cd->proStaticAttribs,"protected-static-attrib");
generateDEFClassSection(cd,t,cd->priTypes,"private-type");
generateDEFClassSection(cd,t,cd->priMethods,"private-func");
generateDEFClassSection(cd,t,cd->priAttribs,"private-attrib");
generateDEFClassSection(cd,t,cd->priSlots,"private-slot");
generateDEFClassSection(cd,t,cd->priStaticMethods,"private-static-func");
generateDEFClassSection(cd,t,cd->priStaticAttribs,"private-static-attrib");
generateDEFClassSection(cd,t,cd->friends,"signal");
generateDEFClassSection(cd,t,cd->related,"related");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::pubTypes),"public-type");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::pubMethods),"public-func");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::pubAttribs),"public-attrib");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::pubSlots),"public-slot");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::signals),"signal");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::dcopMethods),"dcop-func");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::properties),"property");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::pubStaticMethods),"public-static-func");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::pubStaticAttribs),"public-static-attrib");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::proTypes),"protected-type");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::proMethods),"protected-func");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::proAttribs),"protected-attrib");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::proSlots),"protected-slot");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::proStaticMethods),"protected-static-func");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::proStaticAttribs),"protected-static-attrib");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::priTypes),"private-type");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::priMethods),"private-func");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::priAttribs),"private-attrib");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::priSlots),"private-slot");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::priStaticMethods),"private-static-func");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::priStaticAttribs),"private-static-attrib");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::friends),"signal");
generateDEFClassSection(cd,t,cd->getMemberList(MemberList::related),"related");
}
t << " cp-filename = '" << cd->getDefFileName() << "';" << endl;
......@@ -512,12 +499,12 @@ void generateDEFForNamespace(NamespaceDef *nd,QTextStream &t)
writeDEFString(t,nd->name());
t << ';' << endl;
generateDEFSection(nd,t,&nd->decDefineMembers,"define");
generateDEFSection(nd,t,&nd->decProtoMembers,"prototype");
generateDEFSection(nd,t,&nd->decTypedefMembers,"typedef");
generateDEFSection(nd,t,&nd->decEnumMembers,"enum");
generateDEFSection(nd,t,&nd->decFuncMembers,"func");
generateDEFSection(nd,t,&nd->decVarMembers,"var");
generateDEFSection(nd,t,nd->getMemberList(MemberList::decDefineMembers),"define");
generateDEFSection(nd,t,nd->getMemberList(MemberList::decProtoMembers),"prototype");
generateDEFSection(nd,t,nd->getMemberList(MemberList::decTypedefMembers),"typedef");
generateDEFSection(nd,t,nd->getMemberList(MemberList::decEnumMembers),"enum");
generateDEFSection(nd,t,nd->getMemberList(MemberList::decFuncMembers),"func");
generateDEFSection(nd,t,nd->getMemberList(MemberList::decVarMembers),"var");
t << " ns-filename = '" << nd->getDefFileName() << "';" << endl;
t << " ns-fileline = '" << nd->getDefLine() << "';" << endl;
......@@ -539,12 +526,12 @@ void generateDEFForFile(FileDef *fd,QTextStream &t)
writeDEFString(t,fd->name());
t << ';' << endl;
generateDEFSection(fd,t,fd->decDefineMembers,"define");
generateDEFSection(fd,t,fd->decProtoMembers,"prototype");
generateDEFSection(fd,t,fd->decTypedefMembers,"typedef");
generateDEFSection(fd,t,fd->decEnumMembers,"enum");
generateDEFSection(fd,t,fd->decFuncMembers,"func");
generateDEFSection(fd,t,fd->decVarMembers,"var");
generateDEFSection(fd,t,fd->getMemberList(MemberList::decDefineMembers),"define");
generateDEFSection(fd,t,fd->getMemberList(MemberList::decProtoMembers),"prototype");
generateDEFSection(fd,t,fd->getMemberList(MemberList::decTypedefMembers),"typedef");
generateDEFSection(fd,t,fd->getMemberList(MemberList::decEnumMembers),"enum");
generateDEFSection(fd,t,fd->getMemberList(MemberList::decFuncMembers),"func");
generateDEFSection(fd,t,fd->getMemberList(MemberList::decVarMembers),"var");
t << " file-full-name = '" << fd->getDefFileName() << "';" << endl;
t << " file-first-line = '" << fd->getDefLine() << "';" << endl;
......
......@@ -46,14 +46,41 @@ static void addToMap(const char *name,Definition *d)
if (index!=-1) symbolName=symbolName.mid(index+2);
if (!symbolName.isEmpty())
{
DefinitionList *dl=Doxygen::symbolMap->find(symbolName);
if (dl==0)
//printf("******* adding symbol `%s' (%p)\n",symbolName.data(),d);
DefinitionIntf *di=Doxygen::symbolMap->find(symbolName);
//printf(" addToMap(%p): looking for symbol %s: %p\n",d,symbolName.data(),di);
if (di==0) // new Symbol
{
dl = new DefinitionList;
Doxygen::symbolMap->append(symbolName,dl);
//printf(" new symbol!\n");
Doxygen::symbolMap->insert(symbolName,d);
}
//printf("******* adding symbol `%s' (%p)\n",symbolName.data(),d);
else // existing symbol
{
//printf(" existing symbol: ");
if (di->definitionType()==DefinitionIntf::TypeSymbolList) // already multiple symbols
{
//printf("adding to exiting list\n");
DefinitionList *dl = (DefinitionList*)di;
dl->append(d);
}
else // going from one to two symbols
{
Doxygen::symbolMap->take(symbolName);
DefinitionList *dl = new DefinitionList;
//printf("replacing symbol by list %p with elements %p and %p\n",dl,di,d);
dl->append((Definition*)di);
dl->append(d);
Doxygen::symbolMap->insert(symbolName,dl);
}
}
// auto resize if needed
static int sizeIndex=9;
if (Doxygen::symbolMap->size()>SDict_primes[sizeIndex])
{
Doxygen::symbolMap->resize(SDict_primes[++sizeIndex]);
}
d->setSymbolName(symbolName);
}
}
......@@ -66,12 +93,26 @@ static void removeFromMap(Definition *d)
if (!symbolName.isEmpty())
{
//printf("******* removing symbol `%s' (%p)\n",symbolName.data(),d);
DefinitionList *dl=Doxygen::symbolMap->find(symbolName);
if (dl)
DefinitionIntf *di=Doxygen::symbolMap->find(symbolName);
if (di)
{
ASSERT(dl!=0);
ASSERT(di!=0);
if (di!=d) // symbolName not unique
{
//printf(" removing from list: %p!\n",di);
DefinitionList *dl = (DefinitionList*)di;
bool b = dl->removeRef(d);
ASSERT(b==TRUE);
if (dl->isEmpty())
{
Doxygen::symbolMap->take(symbolName);
}
}
else // symbolName unique
{
//printf(" removing symbol %p\n",di);
Doxygen::symbolMap->take(symbolName);
}
}
}
}
......
......@@ -54,18 +54,27 @@ struct BodyInfo
FileDef *fileDef; // file definition containing the function body
};
/*! The common base class of all entity definitions found in the sources. */
class Definition
/*! Abstract interface for a Definition or DefinitionList */
class DefinitionIntf
{
public:
DefinitionIntf() {}
virtual ~DefinitionIntf() {}
/*! Types of derived classes */
enum DefType
{
TypeClass, TypeMember, TypeFile, TypeGroup,
TypeNamespace, TypePackage, TypePage, TypeDir
TypeNamespace, TypePackage, TypePage, TypeDir,
TypeSymbolList
};
/*! Use this for dynamic inspection of the type of the derived class */
virtual DefType definitionType() const = 0;
};
/*! The common base class of all entity definitions found in the sources. */
class Definition : public DefinitionIntf
{
public:
/*! Create a new definition */
Definition(
......@@ -76,16 +85,24 @@ class Definition
/*! Destroys the definition */
virtual ~Definition();
//-----------------------------------------------------------------------------------
// ---- getters -----
//-----------------------------------------------------------------------------------
/*! Returns the name of the definition */
const QCString& name() const { return m_name; }
/*! Returns the local name without any scope qualifiers. */
QCString localName() const;
/*! Returns the base name of the output file that contains this
* definition.
*/
virtual QCString qualifiedName();
/*! Returns the local name without any scope qualifiers. */
QCString localName() const;
/*! Returns the name of this definition as it appears in the symbol map.
*/
QCString symbolName() const { return m_symbolName; }
/*! Returns the base file name (without extension) of this definition.
* as it is referenced to/written to disk.
......@@ -98,15 +115,6 @@ class Definition
/*! Returns the detailed description of this definition */
QCString documentation() const { return m_details ? m_details->doc : QCString(""); }
/*! Returns the brief description of this definition */
QCString briefDescription() const { return m_brief ? m_brief->doc : QCString(""); }
/*! Sets a new \a name for the definition */
void setName(const char *name) { m_name=name; }
/*! Sets the documentation of this definition to \a d. */
void setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace=TRUE);
/*! Returns the line number at which the detailed documentation was found. */
int docLine() const { return m_details ? m_details->line : 1; }
......@@ -115,10 +123,8 @@ class Definition
*/
QCString docFile() const { return m_details ? m_details->file : QCString("<"+m_name+">"); }
/*! Sets the brief description of this definition to \a b.
* A dot is added to the sentence if not available.
*/
void setBriefDescription(const char *b,const char *briefFile,int briefLine);
/*! Returns the brief description of this definition */
QCString briefDescription() const { return m_brief ? m_brief->doc : QCString(""); }
/*! Returns the line number at which the brief description was found. */
int briefLine() const { return m_brief ? m_brief->line : 1; }
......@@ -166,6 +172,8 @@ class Definition
virtual bool isVisible() const
{ return m_hidden || isLinkable(); }
bool isHidden() const { return m_hidden; }
/*! If this definition was imported via a tag file, this function
* returns the tagfile for the external project. This can be
* translated into an external link target via
......@@ -176,12 +184,37 @@ class Definition
/*! Returns TRUE if this definition is imported via a tag file. */
virtual bool isReference() const { return !m_ref.isEmpty(); }
/*! Sets the tag file id via which this definition was imported. */
void setReference(const char *r) { m_ref=r; }
int getStartBodyLine() const { return m_body ? m_body->startLine : -1; }
int getEndBodyLine() const { return m_body ? m_body->endLine : -1; }
FileDef *getBodyDef() { return m_body ? m_body->fileDef : 0; }
/*! Returns the name of this definition as it appears in the symbol map.
GroupList *partOfGroups() const { return m_partOfGroups; }
const QList<ListItemInfo> *xrefListItems() const;
virtual Definition *findInnerCompound(const char *name);
virtual Definition *getOuterScope() const { return m_outerScope; }
MemberSDict *getReferencesMembers() const { return m_sourceRefsDict; }
MemberSDict *getReferencedByMembers() const { return m_sourceRefByDict; }
//-----------------------------------------------------------------------------------
// ---- setters -----
//-----------------------------------------------------------------------------------
/*! Sets a new \a name for the definition */
void setName(const char *name) { m_name=name; }
/*! Sets the documentation of this definition to \a d. */
void setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace=TRUE);
/*! Sets the brief description of this definition to \a b.
* A dot is added to the sentence if not available.
*/
QCString symbolName() const { return m_symbolName; }
void setBriefDescription(const char *b,const char *briefFile,int briefLine);
/*! Sets the tag file id via which this definition was imported. */
void setReference(const char *r) { m_ref=r; }
/*! Sets the name of this definition as it should appear in the symbol map.
*/
......@@ -192,47 +225,37 @@ class Definition
*/
void addSectionsToDefinition(QList<SectionInfo> *anchorList);
/*! Writes the documentation anchors of the definition to
* the Doxygen::tagFile stream.
*/
void writeDocAnchorsToTagFile();
bool isHidden() const { return m_hidden; }
// source references
void setBodySegment(int bls,int ble);
void setBodyDef(FileDef *fd);
int getStartBodyLine() const { return m_body ? m_body->startLine : -1; }
int getEndBodyLine() const { return m_body ? m_body->endLine : -1; }
FileDef *getBodyDef() { return m_body ? m_body->fileDef : 0; }
void writeSourceDef(OutputList &ol,const char *scopeName);
void writeInlineCode(OutputList &ol,const char *scopeName);
void writeSourceRefs(OutputList &ol,const char *scopeName);
void writeSourceReffedBy(OutputList &ol,const char *scopeName);
void addSourceReferencedBy(MemberDef *d);
void addSourceReferences(MemberDef *d);
void setRefItems(const QList<ListItemInfo> *sli);
void mergeRefItems(Definition *d);
const QList<ListItemInfo> *xrefListItems() const;
virtual Definition *findInnerCompound(const char *name);
virtual Definition *getOuterScope() const { return m_outerScope; }
virtual void addInnerCompound(Definition *d);
virtual void setOuterScope(Definition *d);
MemberSDict *getReferencesMembers() const { return m_sourceRefsDict; }
MemberSDict *getReferencedByMembers() const { return m_sourceRefByDict; }
void setHidden(bool b) { m_hidden = b; }
void makePartOfGroup(GroupDef *gd);
GroupList *partOfGroups() const { return m_partOfGroups; }
QCString convertNameToFile(const char *name,bool allowDots=FALSE) const;
//-----------------------------------------------------------------------------------
// --- actions ----
//-----------------------------------------------------------------------------------
QCString convertNameToFile(const char *name,bool allowDots=FALSE) const;
void writeSourceDef(OutputList &ol,const char *scopeName);
void writeInlineCode(OutputList &ol,const char *scopeName);
void writeSourceRefs(OutputList &ol,const char *scopeName);
void writeSourceReffedBy(OutputList &ol,const char *scopeName);
void makePartOfGroup(GroupDef *gd);
void writePathFragment(OutputList &ol) const;
void writeNavigationPath(OutputList &ol) const;
virtual void writeQuickMemberLinks(OutputList &,MemberDef *) const {}
void setHidden(bool b) { m_hidden = b; }
/*! Writes the documentation anchors of the definition to
* the Doxygen::tagFile stream.
*/
void writeDocAnchorsToTagFile();
protected:
void setLocalName(const QCString name) { m_localName=name; }
......@@ -241,7 +264,13 @@ class Definition
int getXRefListId(const char *listName) const;
void writeSourceRefList(OutputList &ol,const char *scopeName,
const QCString &text,MemberSDict *members,bool);
//-----------------------------------------------------------------------------------
// --- member variables
//-----------------------------------------------------------------------------------
SectionDict *m_sectionDict; // dictionary of all sections
MemberSDict *m_sourceRefByDict;
MemberSDict *m_sourceRefsDict;
......@@ -271,10 +300,11 @@ class Definition
QCString m_defFileExt;
};
class DefinitionList : public QList<Definition>
class DefinitionList : public QList<Definition>, public DefinitionIntf
{
public:
~DefinitionList() {}
DefType definitionType() const { return TypeSymbolList; }
int compareItems(GCI item1,GCI item2)
{
return stricmp(((Definition *)item1)->name(),
......
......@@ -70,8 +70,6 @@ class DirDef : public Definition
void writeDetailedDocumentation(OutputList &ol);
void writeDocumentation(OutputList &ol);
void writeDepGraph(QTextStream &t);
//void writePathFragment(OutputList &ol) const;
//void writeNavigationPath(OutputList &ol);
static DirDef *mergeDirectoryInTree(const QCString &path);
bool visited;
......
......@@ -3582,6 +3582,31 @@ void DocSimpleSect::appendLinkWord(const QString &word)
g_inSeeBlock=FALSE;
}
QCString DocSimpleSect::typeString() const
{
switch (m_type)
{
case Unknown: break;
case See: return "see";
case Return: return "return";
case Author: // fall through
case Authors: return "author";
case Version: return "version";
case Since: return "since";
case Date: return "date";
case Note: return "note";
case Warning: return "warning";
case Pre: return "pre";
case Post: return "post";
case Invar: return "invariant";
case Remark: return "remark";
case Attention: return "attention";
case User: return "user";
case Rcs: return "rcs";
}
return "unknown";
}
//--------------------------------------------------------------------------
int DocParamList::parse(const QString &cmdName)
......
......@@ -915,6 +915,7 @@ class DocSimpleSect : public CompAccept<DocSimpleSect>, public DocNode
virtual ~DocSimpleSect();
Kind kind() const { return Kind_SimpleSect; }
Type type() const { return m_type; }
QCString typeString() const;
DocNode *parent() const { return m_parent; }
void accept(DocVisitor *v);
int parse(bool userTitle);
......
......@@ -629,29 +629,29 @@ void DotNode::writeBox(QTextStream &t,
{
t << "{" << convertLabel(m_label);
t << "\\n|";
writeBoxMemberList(t,'+',m_classDef->pubAttribs,m_classDef);
writeBoxMemberList(t,'+',m_classDef->pubStaticAttribs,m_classDef);
writeBoxMemberList(t,'~',m_classDef->pacAttribs,m_classDef);
writeBoxMemberList(t,'~',m_classDef->pacStaticAttribs,m_classDef);
writeBoxMemberList(t,'#',m_classDef->proAttribs,m_classDef);
writeBoxMemberList(t,'#',m_classDef->proStaticAttribs,m_classDef);
writeBoxMemberList(t,'-',m_classDef->priAttribs,m_classDef);
writeBoxMemberList(t,'-',m_classDef->priStaticAttribs,m_classDef);
writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubAttribs),m_classDef);
writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubStaticAttribs),m_classDef);
writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacAttribs),m_classDef);
writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacStaticAttribs),m_classDef);
writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proAttribs),m_classDef);
writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proStaticAttribs),m_classDef);
writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priAttribs),m_classDef);
writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priStaticAttribs),m_classDef);
t << "|";
writeBoxMemberList(t,'+',m_classDef->pubMethods,m_classDef);
writeBoxMemberList(t,'+',m_classDef->pubStaticMethods,m_classDef);
writeBoxMemberList(t,'+',m_classDef->pubSlots,m_classDef);
writeBoxMemberList(t,'~',m_classDef->pacMethods,m_classDef);
writeBoxMemberList(t,'~',m_classDef->pacStaticMethods,m_classDef);
writeBoxMemberList(t,'#',m_classDef->proMethods,m_classDef);
writeBoxMemberList(t,'#',m_classDef->proStaticMethods,m_classDef);
writeBoxMemberList(t,'#',m_classDef->proSlots,m_classDef);
writeBoxMemberList(t,'-',m_classDef->priMethods,m_classDef);
writeBoxMemberList(t,'-',m_classDef->priStaticMethods,m_classDef);
writeBoxMemberList(t,'-',m_classDef->priSlots,m_classDef);
if (m_classDef->memberGroupSDict)
{
MemberGroupSDict::Iterator mgdi(*m_classDef->memberGroupSDict);
writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubMethods),m_classDef);
writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubStaticMethods),m_classDef);
writeBoxMemberList(t,'+',m_classDef->getMemberList(MemberList::pubSlots),m_classDef);
writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacMethods),m_classDef);
writeBoxMemberList(t,'~',m_classDef->getMemberList(MemberList::pacStaticMethods),m_classDef);
writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proMethods),m_classDef);
writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proStaticMethods),m_classDef);
writeBoxMemberList(t,'#',m_classDef->getMemberList(MemberList::proSlots),m_classDef);
writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priMethods),m_classDef);
writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priStaticMethods),m_classDef);
writeBoxMemberList(t,'-',m_classDef->getMemberList(MemberList::priSlots),m_classDef);
if (m_classDef->getMemberGroupSDict())
{
MemberGroupSDict::Iterator mgdi(*m_classDef->getMemberGroupSDict());
MemberGroup *mg;
for (mgdi.toFirst();(mg=mgdi.current());++mgdi)
{
......@@ -2774,7 +2774,7 @@ void DotGroupCollaboration::buildGraph(GroupDef* gd,int)
// Write collaboration
// Add members
addMemberList( gd->getMembers() );
addMemberList( gd->getMemberList(MemberList::allMembersList) );
// Add classes
if ( gd->getClasses() && gd->getClasses()->count() )
......
......@@ -27,6 +27,7 @@
#include <stdlib.h>
#include <sys/stat.h>
#include <qtextcodec.h>
#include <unistd.h>
#include "version.h"
#include "doxygen.h"
......@@ -66,6 +67,7 @@
#include "parserintf.h"
#include "htags.h"
#include "pyscanner.h"
#include "code.h"
#define RECURSE_ENTRYTREE(func,var) \
......@@ -125,7 +127,7 @@ bool Doxygen::parseSourcesNeeded = FALSE;
double Doxygen::sysElapsedTime = 0.0;
QTime Doxygen::runningTime;
SearchIndex * Doxygen::searchIndex=0;
SDict<DefinitionList> *Doxygen::symbolMap;
QDict<DefinitionIntf> *Doxygen::symbolMap;
bool Doxygen::outputToWizard=FALSE;
QDict<int> * Doxygen::htmlDirMap = 0;
QCache<LookupInfo> Doxygen::lookupCache(50000,50000);
......@@ -1406,7 +1408,9 @@ static void findUsingDirectives(EntryNav *rootNav)
// see if the using statement was found inside a namespace or inside
// the global file scope.
if (rootNav->parent() && rootNav->parent()->section() == Entry::NAMESPACE_SEC)
if (rootNav->parent() && rootNav->parent()->section()==Entry::NAMESPACE_SEC &&
(fd==0 || fd->name().right(5)!=".java") // not a .java file
)
{
nsName=stripAnonymousNamespaceScope(rootNav->parent()->name());
if (!nsName.isEmpty())
......@@ -1582,8 +1586,13 @@ static void findUsingDeclarations(EntryNav *rootNav)
// file scope).
QCString name = substitute(root->name,".","::");
MemberDef *mtd=0;
usingCd = getResolvedClass(nd,fd,name,&mtd);
//MemberDef *mtd=0;
//usingCd = getResolvedClass(nd,fd,name,&mtd);
usingCd = getClass(name);
if (usingCd==0)
{
usingCd = Doxygen::hiddenClasses.find(name);
}
//printf("%s -> %p\n",root->name.data(),usingCd);
if (usingCd==0) // definition not in the input => add an artificial class
......@@ -1592,7 +1601,7 @@ static void findUsingDeclarations(EntryNav *rootNav)
name.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1);
usingCd = new ClassDef(
"<using>",1,
root->name,ClassDef::Class);
name,ClassDef::Class);
Doxygen::hiddenClasses.append(root->name,usingCd);
usingCd->setClassIsArtificial();
}
......@@ -1602,6 +1611,7 @@ static void findUsingDeclarations(EntryNav *rootNav)
usingCd->name().data(),nd?nd->name().data():fd->name().data());
}
#if 0
if (mtd) // add the typedef to the correct scope
{
if (nd)
......@@ -1615,7 +1625,9 @@ static void findUsingDeclarations(EntryNav *rootNav)
fd->addUsingDeclaration(mtd);
}
}
else if (usingCd) // add the class to the correct scope
else
#endif
if (usingCd) // add the class to the correct scope
{
if (nd)
{
......@@ -2371,8 +2383,9 @@ static void buildVarList(EntryNav *rootNav)
scope=root->relates;
}
// note: changed from scope to classScope on 2-10-2005
if (!classScope.isEmpty() && !name.isEmpty() && (cd=getClass(classScope)))
cd=getClass(scope);
if (cd==0 && classScope!=scope) cd=getClass(classScope);
if (cd)
{
MemberDef *md=0;
......@@ -4946,7 +4959,9 @@ static void findMember(EntryNav *rootNav,
}
if (root->relates.isEmpty() && rootNav->parent() &&
(rootNav->parent()->section()&Entry::SCOPE_MASK) &&
((rootNav->parent()->section()&Entry::SCOPE_MASK) ||
(rootNav->parent()->section()==Entry::OBJCIMPL_SEC)
) &&
!rootNav->parent()->name().isEmpty()) // see if we can combine scopeName
// with the scope in which it was found
{
......@@ -5373,6 +5388,7 @@ static void findMember(EntryNav *rootNav,
mn->append(md);
cd->insertMember(md);
md->setRefItems(root->sli);
delete tArgList;
}
else
{
......@@ -5711,6 +5727,7 @@ static void filterMemberDocumentation(EntryNav *rootNav)
"findMemberDocumentation(): root->type=`%s' root->inside=`%s' root->name=`%s' root->args=`%s' section=%x root->memSpec=%d root->mGrpId=%d\n",
root->type.data(),root->inside.data(),root->name.data(),root->args.data(),root->section,root->memSpec,root->mGrpId
);
//printf("rootNav->parent()->name()=%s\n",rootNav->parent()->name().data());
bool isFunc=TRUE;
if (root->relatesDup && !root->relates.isEmpty())
......@@ -7426,7 +7443,7 @@ static void generateNamespaceDocs()
nd->writeDocumentation(*outputList);
}
// for each class in the namespace...
ClassSDict::Iterator cli(*nd->classSDict);
ClassSDict::Iterator cli(*nd->getClassSDict());
for ( ; cli.current() ; ++cli )
{
ClassDef *cd=cli.current();
......@@ -8267,8 +8284,8 @@ void initDoxygen()
setlocale(LC_ALL,"");
setlocale(LC_NUMERIC,"C");
#endif
Doxygen::symbolMap = new SDict<DefinitionList>(1000);
Doxygen::symbolMap->setAutoDelete(TRUE);
Doxygen::symbolMap = new QDict<DefinitionIntf>(1000);
//Doxygen::symbolMap->setAutoDelete(TRUE);
Doxygen::globalScope = new NamespaceDef("<globalScope>",1,"<globalScope>");
Doxygen::runningTime.start();
......@@ -8315,6 +8332,26 @@ void cleanUpDoxygen()
delete theTranslator;
delete outputList;
Mappers::freeMappers();
codeFreeScanner();
// iterate through Doxygen::symbolMap and delete all
// DefinitionList objects, since they have no owner
QDictIterator<DefinitionIntf> dli(*Doxygen::symbolMap);
DefinitionIntf *di;
for (dli.toFirst();(di=dli.current());)
{
if (di->definitionType()==DefinitionIntf::TypeSymbolList)
{
DefinitionIntf *tmp = Doxygen::symbolMap->take(dli.currentKey());
delete (DefinitionList *)tmp;
}
else
{
++dli;
}
}
//delete Doxygen::symbolMap; <- we cannot do this unless all static lists
// (such as Doxygen::namespaceSDict)
// with objects based on Definition are made
......@@ -8596,6 +8633,14 @@ void readConfiguration(int argc, char **argv)
exit(0);
}
/* Perlmod wants to know the path to the config file.*/
QFileInfo configFileInfo(configName);
setPerlModDoxyfile(configFileInfo.absFilePath());
}
void checkConfiguration()
{
Config::instance()->substituteEnvironmentVars();
Config::instance()->convertStrToVal();
Config::instance()->check();
......@@ -8620,9 +8665,6 @@ 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());
Doxygen::xrefLists->setAutoDelete(TRUE);
......@@ -8941,6 +8983,16 @@ void parseInput()
exit(1);
}
// we are done with input scanning now, so free up the buffers used by flex
// (can be around 4MB)
preFreeScanner();
scanFreeScanner();
pyscanFreeScanner();
//delete rootNav;
//g_storage.close();
//exit(1);
/**************************************************************************
* Gather information *
**************************************************************************/
......
......@@ -110,7 +110,7 @@ class Doxygen
static double sysElapsedTime;
static QTime runningTime;
static SearchIndex *searchIndex;
static SDict<DefinitionList> *symbolMap;
static QDict<DefinitionIntf> *symbolMap;
static bool outputToWizard;
static QDict<int> *htmlDirMap;
static QCache<LookupInfo> lookupCache;
......@@ -122,6 +122,7 @@ class Doxygen
void initDoxygen();
void readConfiguration(int argc, char **argv);
void checkConfiguration();
void parseInput();
void generateOutput();
......
......@@ -24,6 +24,7 @@ int Entry::num=0;
Entry::Entry()
{
//printf("Entry::Entry(%p)\n",this);
num++;
m_parent=0;
section = EMPTY_SEC;
......@@ -33,7 +34,7 @@ Entry::Entry()
extends->setAutoDelete(TRUE);
groups = new QList<Grouping>;
groups->setAutoDelete(TRUE);
anchors = new QList<SectionInfo>;
anchors = new QList<SectionInfo>; // Doxygen::sectionDict takes ownership of the items!
argList = new ArgumentList;
argList->setAutoDelete(TRUE);
//printf("Entry::Entry() tArgList=0\n");
......@@ -49,6 +50,7 @@ Entry::Entry()
Entry::Entry(const Entry &e)
{
//printf("Entry::Entry(%p):copy\n",this);
num++;
section = e.section;
protection = e.protection;
......@@ -171,17 +173,17 @@ Entry::Entry(const Entry &e)
Entry::~Entry()
{
//printf("Entry::~Entry(%p) num=%d\n",this,num);
//printf("Deleting entry %d name %s type %x children %d\n",
// num,name.data(),section,sublist->count());
//delete sublist; // each element is now own by a EntryNav so we do no longer own
delete m_sublist; // each element is now own by a EntryNav so we do no longer own
// our children.
delete extends;
delete groups;
delete anchors;
delete argList;
delete tArgLists;
//delete mtArgList;
delete tagInfo;
delete sli;
num--;
......@@ -200,6 +202,7 @@ void Entry::addSubEntry(Entry *current)
void Entry::reset()
{
//printf("Entry::reset()\n");
name.resize(0);
type.resize(0);
args.resize(0);
......@@ -273,12 +276,14 @@ void Entry::createSubtreeIndex(EntryNav *nav,QFile &storage,FileDef *fd)
{
childNode->createSubtreeIndex(childNav,storage,fd);
}
//m_sublist->setAutoDelete(FALSE);
m_sublist->clear();
}
}
void Entry::createNavigationIndex(EntryNav *rootNav,QFile &storage,FileDef *fd)
{
//printf("createNavigationIndex(%p) sublist=%p\n",this,m_sublist);
if (m_sublist)
{
//printf("saveEntries: %d children\n",root->sublist->count());
......@@ -290,6 +295,7 @@ void Entry::createNavigationIndex(EntryNav *rootNav,QFile &storage,FileDef *fd)
createSubtreeIndex(rootNav,storage,fd);
}
// remove all entries from root
//m_sublist->setAutoDelete(FALSE);
m_sublist->clear();
}
}
......@@ -535,6 +541,7 @@ ArgumentList *unmarshalArgumentList(QFile &f)
uint count = unmarshalUInt(f);
if (count==NULL_LIST) return 0; // null list
ArgumentList *result = new ArgumentList;
result->setAutoDelete(TRUE);
//printf("unmarshalArgumentList: %d\n",count);
for (i=0;i<count;i++)
{
......@@ -560,6 +567,7 @@ QList<ArgumentList> *unmarshalArgumentLists(QFile &f)
uint count = unmarshalUInt(f);
if (count==NULL_LIST) return 0; // null list
QList<ArgumentList> *result = new QList<ArgumentList>;
result->setAutoDelete(TRUE);
//printf("unmarshalArgumentLists: %d\n",count);
for (i=0;i<count;i++)
{
......@@ -574,6 +582,7 @@ QList<BaseInfo> *unmarshalBaseInfoList(QFile &f)
uint count = unmarshalUInt(f);
if (count==NULL_LIST) return 0; // null list
QList<BaseInfo> *result = new QList<BaseInfo>;
result->setAutoDelete(TRUE);
for (i=0;i<count;i++)
{
QCString name = unmarshalQCString(f);
......@@ -590,6 +599,7 @@ QList<Grouping> *unmarshalGroupingList(QFile &f)
uint count = unmarshalUInt(f);
if (count==NULL_LIST) return 0; // null list
QList<Grouping> *result = new QList<Grouping>;
result->setAutoDelete(TRUE);
for (i=0;i<count;i++)
{
QCString name = unmarshalQCString(f);
......@@ -605,6 +615,7 @@ QList<SectionInfo> *unmarshalSectionInfoList(QFile &f)
uint count = unmarshalUInt(f);
if (count==NULL_LIST) return 0; // null list
QList<SectionInfo> *result = new QList<SectionInfo>;
result->setAutoDelete(TRUE);
for (i=0;i<count;i++)
{
QCString label = unmarshalQCString(f);
......@@ -623,6 +634,7 @@ QList<ListItemInfo> *unmarshalItemInfoList(QFile &f)
uint count = unmarshalUInt(f);
if (count==NULL_LIST) return 0; // null list
QList<ListItemInfo> *result = new QList<ListItemInfo>;
result->setAutoDelete(TRUE);
for (i=0;i<count;i++)
{
ListItemInfo *lii = new ListItemInfo;
......@@ -710,6 +722,7 @@ bool loadEntry(Entry *e,QFile &f)
e->virt = (Specifier)unmarshalInt(f);
e->args = unmarshalQCString(f);
e->bitfields = unmarshalQCString(f);
delete e->argList;
e->argList = unmarshalArgumentList(f);
e->tArgLists = unmarshalArgumentLists(f);
e->program = unmarshalQCString(f);
......@@ -734,8 +747,11 @@ bool loadEntry(Entry *e,QFile &f)
e->bodyLine = unmarshalInt(f);
e->endBodyLine = unmarshalInt(f);
e->mGrpId = unmarshalInt(f);
delete e->extends;
e->extends = unmarshalBaseInfoList(f);
delete e->groups;
e->groups = unmarshalGroupingList(f);
delete e->anchors;
e->anchors = unmarshalSectionInfoList(f);
e->fileName = unmarshalQCString(f);
e->startLine = unmarshalInt(f);
......@@ -832,8 +848,8 @@ void EntryNav::releaseEntry()
{
if (!m_noLoad)
{
delete m_info;
//printf("EntryNav::releaseEntry %p\n",m_info);
delete m_info;
m_info=0;
}
}
......
This diff is collapsed.
......@@ -127,6 +127,8 @@ class FileDef : public Definition
}
bool isIncluded(const QCString &name) const;
bool isJava() const { return m_isJava; }
void writeDetailedDocumentation(OutputList &ol);
void writeDocumentation(OutputList &ol);
void writeMemberDocumentation(OutputList &ol);
......@@ -168,9 +170,13 @@ class FileDef : public Definition
void addListReferences();
bool isDocumentationFile() const;
//void generateXML(QTextStream &t);
//void generateXMLSection(QTextStream &t,MemberList *ml,const char *type);
MemberList *getMemberList(MemberList::ListType lt) const;
const QList<MemberList> &getMemberLists() const { return m_memberLists; }
#if 0
MemberList *allMemberList;
// members in the declaration part of the documentation
......@@ -188,12 +194,12 @@ class FileDef : public Definition
MemberList *docEnumMembers;
MemberList *docFuncMembers;
MemberList *docVarMembers;
#endif
/* user defined member groups */
MemberGroupSDict *memberGroupSDict;
NamespaceSDict *namespaceSDict;
ClassSDict *classSDict;
MemberGroupSDict *getMemberGroupSDict() const { return memberGroupSDict; }
NamespaceSDict *getNamespaceSDict() const { return namespaceSDict; }
ClassSDict *getClassSDict() const { return classSDict; }
bool visited;
......@@ -204,6 +210,11 @@ class FileDef : public Definition
void acquireFileVersion();
private:
MemberList *createMemberList(MemberList::ListType lt);
void addMemberToList(MemberList::ListType lt,MemberDef *md);
void writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title);
void writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title);
QDict<IncludeInfo> *includeDict;
QList<IncludeInfo> *includeList;
QDict<IncludeInfo> *includedByDict;
......@@ -218,9 +229,14 @@ class FileDef : public Definition
QIntDict<Definition> *srcDefDict;
QIntDict<MemberDef> *srcMemberDict;
bool isSource;
bool m_isJava;
QCString fileVersion;
PackageDef *package;
DirDef *dir;
QList<MemberList> m_memberLists;
MemberGroupSDict *memberGroupSDict;
NamespaceSDict *namespaceSDict;
ClassSDict *classSDict;
};
......
......@@ -107,7 +107,8 @@ void FormulaList::generateBitmaps(const char *path)
if (latexCmd.isEmpty()) latexCmd="latex";
if (iSystem(latexCmd,"_formulas.tex")!=0)
{
err("Problems running latex. Check your installation or look for typos in _formulas.tex!\n");
err("Problems running latex. Check your installation or look "
"for typos in _formulas.tex and check _formulas.log!\n");
formulaError=TRUE;
//return;
}
......@@ -286,7 +287,7 @@ void FormulaList::generateBitmaps(const char *path)
}
// remove intermediate files produced by latex
thisDir.remove("_formulas.dvi");
thisDir.remove("_formulas.log");
if (!formulaError) thisDir.remove("_formulas.log"); // keep file in case of errors
thisDir.remove("_formulas.aux");
}
// remove the latex file itself
......
This diff is collapsed.
......@@ -92,26 +92,11 @@ class GroupDef : public Definition
void setGroupScope(Definition *d) { groupScope = d; }
Definition *getGroupScope() const { return groupScope; }
// members in the declaration part of the documentation
MemberList decDefineMembers;
MemberList decProtoMembers;
MemberList decTypedefMembers;
MemberList decEnumMembers;
MemberList decEnumValMembers;
MemberList decFuncMembers;
MemberList decVarMembers;
// members in the documentation part of the documentation
MemberList docDefineMembers;
MemberList docProtoMembers;
MemberList docTypedefMembers;
MemberList docEnumMembers;
MemberList docEnumValMembers;
MemberList docFuncMembers;
MemberList docVarMembers;
MemberList *getMemberList(MemberList::ListType lt) const;
const QList<MemberList> &getMemberLists() const { return m_memberLists; }
/* user defined member groups */
MemberGroupSDict *memberGroupSDict;
MemberGroupSDict *getMemberGroupSDict() const { return memberGroupSDict; }
FileList * getFiles() const { return fileList; }
ClassSDict * getClasses() const { return classSDict; }
......@@ -119,12 +104,18 @@ class GroupDef : public Definition
GroupList * getSubGroups() const { return groupList; }
PageSDict * getPages() const { return pageDict; }
DirList * getDirs() const { return dirList; }
MemberList* getMembers() const { return allMemberList; }
//MemberList* getMembers() const { return allMemberList; }
protected:
void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
private:
MemberList *createMemberList(MemberList::ListType lt);
void addMemberToList(MemberList::ListType lt,MemberDef *md);
void writeMemberDeclarations(OutputList &ol,MemberList::ListType lt,const QCString &title);
void writeMemberDocumentation(OutputList &ol,MemberList::ListType lt,const QCString &title);
void removeMemberFromList(MemberList::ListType lt,MemberDef *md);
QCString title; // title of the group
bool titleSet; // true if title is not the same as the name
QCString fileName; // base name of the generated file
......@@ -141,6 +132,9 @@ class GroupDef : public Definition
Definition *groupScope;
QList<MemberList> m_memberLists;
MemberGroupSDict *memberGroupSDict;
};
class GroupSDict : public SDict<GroupDef>
......
......@@ -444,7 +444,7 @@ void HtmlDocVisitor::visitPost(DocRoot *)
void HtmlDocVisitor::visitPre(DocSimpleSect *s)
{
if (m_hide) return;
m_t << "<dl compact><dt><b>";
m_t << "<dl class=\"" << s->typeString() << "\" compact><dt><b>";
switch(s->type())
{
case DocSimpleSect::See:
......
......@@ -222,6 +222,8 @@ class HtmlGenerator : public OutputGenerator
void writeCodeAnchor(const char *anchor)
{ t << "<a name=\"" << anchor << "\"></a>"; }
void linkableSymbol(int,const char *,Definition *,Definition *) {}
static void writeSearchPage();
private:
......
......@@ -2637,12 +2637,55 @@ void writeGraphInfo(OutputList &ol)
ol.popGeneratorState();
}
void writeGroupIndexItem(GroupDef *gd,MemberList *ml,const QCString &title,
HtmlHelp *htmlHelp,FTVHelp *ftvHelp)
{
if (ml && ml->count()>0)
{
bool first=TRUE;
MemberDef *md=ml->first();
while (md)
{
if (md->isDetailedSectionVisible(TRUE,FALSE))
{
if (first)
{
first=FALSE;
if (htmlHelp)
{
htmlHelp->addContentsItem(TRUE, convertToHtml(title), gd->getOutputFileBase(),0);
htmlHelp->incContentsDepth();
}
if (ftvHelp)
{
ftvHelp->addContentsItem(TRUE, gd->getReference(), gd->getOutputFileBase(), 0, title);
ftvHelp->incContentsDepth();
}
}
if (htmlHelp)
{
htmlHelp->addContentsItem(FALSE,md->name(),md->getOutputFileBase(),md->anchor());
}
if (ftvHelp)
{
ftvHelp->addContentsItem(FALSE,md->getReference(),md->getOutputFileBase(),md->anchor(),md->name());
}
}
md=ml->next();
}
if (htmlHelp && !first) htmlHelp->decContentsDepth();
if (ftvHelp && !first) ftvHelp->decContentsDepth();
}
}
//----------------------------------------------------------------------------
/*!
* write groups as hierarchical trees
* \author KPW
*/
void writeGroupTreeNode(OutputList &ol, GroupDef *gd,int level)
{
HtmlHelp *htmlHelp=0;
......@@ -2680,12 +2723,15 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,int level)
int numSubItems = 0;
if ( Config_getBool("TOC_EXPAND"))
{
numSubItems += gd->docDefineMembers.count();
numSubItems += gd->docTypedefMembers.count();
numSubItems += gd->docEnumMembers.count();
numSubItems += gd->docFuncMembers.count();
numSubItems += gd->docVarMembers.count();
numSubItems += gd->docProtoMembers.count();
QListIterator<MemberList> mli(gd->getMemberLists());
MemberList *ml;
for (mli.toFirst();(ml=mli.current());++mli)
{
if (ml->listType()&MemberList::documentationLists)
{
numSubItems += ml->count();
}
}
numSubItems += gd->namespaceSDict->count();
numSubItems += gd->classSDict->count();
numSubItems += gd->fileList->count();
......@@ -2759,6 +2805,20 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,int level)
if (Config_getBool("TOC_EXPAND"))
{
writeGroupIndexItem(gd,gd->getMemberList(MemberList::docDefineMembers),
theTranslator->trDefines(),htmlHelp,ftvHelp);
writeGroupIndexItem(gd,gd->getMemberList(MemberList::docTypedefMembers),
theTranslator->trTypedefs(),htmlHelp,ftvHelp);
writeGroupIndexItem(gd,gd->getMemberList(MemberList::docEnumMembers),
theTranslator->trEnumerations(),htmlHelp,ftvHelp);
writeGroupIndexItem(gd,gd->getMemberList(MemberList::docFuncMembers),
theTranslator->trFunctions(),htmlHelp,ftvHelp);
writeGroupIndexItem(gd,gd->getMemberList(MemberList::docVarMembers),
theTranslator->trVariables(),htmlHelp,ftvHelp);
writeGroupIndexItem(gd,gd->getMemberList(MemberList::docProtoMembers),
theTranslator->trFuncProtos(),htmlHelp,ftvHelp);
#if 0
// write members
struct MemInfo
{
......@@ -2821,6 +2881,7 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,int level)
}
}
#endif
// write namespaces
NamespaceSDict *namespaceSDict=gd->namespaceSDict;
......
......@@ -212,6 +212,7 @@ class LatexGenerator : public OutputGenerator
void endFontClass() {}
void writeCodeAnchor(const char *) {}
void linkableSymbol(int,const char *,Definition *,Definition *) {}
private:
LatexGenerator(const LatexGenerator &);
......
......@@ -198,6 +198,7 @@ SOURCES = ce_lex.cpp \
win32:TMAKE_CXXFLAGS += -DQT_NODLL
win32-msvc:TMAKE_CXXFLAGS += -Zm200
win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
linux-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
INCLUDEPATH += ../qtools
INCLUDEPATH += ../libpng
INCLUDEPATH += ../libmd5
......
......@@ -33,6 +33,7 @@ int main(int argc,char **argv)
initDoxygen();
readConfiguration(argc,argv);
checkConfiguration();
parseInput();
generateOutput();
return 0;
......
......@@ -267,6 +267,7 @@ class ManGenerator : public OutputGenerator
//void endSectionRefList() {}
void writeCodeAnchor(const char *) {}
void linkableSymbol(int,const char *,Definition *,Definition *) {}
private:
bool firstCol;
......
......@@ -461,7 +461,7 @@ void MemberDef::insertReimplementedBy(MemberDef *md)
{
m_templateMaster->insertReimplementedBy(md);
}
if (redefinedBy==0) redefinedBy = new MemberList;
if (redefinedBy==0) redefinedBy = new MemberList(MemberList::redefinedBy);
if (redefinedBy->findRef(md)==-1)
{
redefinedBy->inSort(md);
......@@ -480,7 +480,7 @@ MemberList *MemberDef::reimplementedBy() const
void MemberDef::insertEnumField(MemberDef *md)
{
if (enumFields==0) enumFields=new MemberList;
if (enumFields==0) enumFields=new MemberList(MemberList::enumFields);
enumFields->append(md);
}
......
......@@ -259,8 +259,6 @@ class MemberDef : public Definition
void setFromAnonymousMember(MemberDef *m) { annMemb=m; }
bool fromAnonymousScope() const { return annScope; }
bool anonymousDeclShown() const { return annUsed; }
//void setIndentDepth( int i) { indDepth=i; }
//int indentDepth() { return indDepth; }
// callgraph related members
bool hasCallGraph() const { return m_hasCallGraph; }
......@@ -283,11 +281,6 @@ class MemberDef : public Definition
MemberDef *inheritsDocsFrom() const { return m_docProvider; }
//QCString getBodyAnchor() const
//{
// return bodyMemb ? bodyMemb->anchor() : anchor();
//}
//void setBodyMember(MemberDef *md) { bodyMemb = md; }
void setDocsForDefinition(bool b) { docsForDefinition = b; }
void setGroupAlias(MemberDef *md) { groupAlias = md; }
MemberDef *getGroupAlias() const { return groupAlias; }
......
......@@ -39,7 +39,7 @@ MemberGroup::MemberGroup(Definition *parent,
int id,const char *hdr,const char *d,const char *docFile)
{
//printf("New member group id=%d header=%s desc=%s\n",id,hdr,d);
memberList = new MemberList;
memberList = new MemberList(MemberList::memberGroup);
grpId = id;
grpHeader = hdr;
doc = d;
......@@ -47,6 +47,7 @@ MemberGroup::MemberGroup(Definition *parent,
inSameSection = TRUE;
inDeclSection = 0;
m_numDecMembers = -1;
m_numDocMembers = -1;
m_parent = parent;
m_docFile = docFile;
//printf("Member group docs=`%s'\n",doc.data());
......@@ -141,6 +142,16 @@ int MemberGroup::countDecMembers(/*bool sectionPerType*/)
return m_numDecMembers;
}
int MemberGroup::countDocMembers()
{
if (m_numDocMembers==-1)
{
memberList->countDocMembers();
m_numDocMembers = memberList->numDocMembers();
}
return m_numDocMembers;
}
void MemberGroup::distributeMemberGroupDocumentation()
{
//printf("MemberGroup::distributeMemberGroupDocumentation() %s\n",grpHeader.data());
......
......@@ -55,7 +55,8 @@ class MemberGroup
QCString documentation() { return doc; }
bool allMembersInSameSection() { return inSameSection; }
void addToDeclarationSection();
int countDecMembers(/*bool sectionPerType*/);
int countDecMembers();
int countDocMembers();
void distributeMemberGroupDocumentation();
void findSectionsInDocumentation();
int varCount() const;
......@@ -83,6 +84,7 @@ class MemberGroup
MemberList *inDeclSection;
bool inSameSection;
int m_numDecMembers;
int m_numDocMembers;
Definition *m_parent;
QCString m_docFile;
};
......
......@@ -26,7 +26,7 @@
#include "outputlist.h"
#include "groupdef.h"
MemberList::MemberList() : QList<MemberDef>()
MemberList::MemberList(ListType lt) : m_listType(lt)
{
memberGroupList=0;
m_numDecMembers=-1; // special value indicating that computation is needed
......@@ -139,7 +139,7 @@ void MemberList::countDocMembers(bool countEnumValues)
MemberGroup *mg;
for (;(mg=mgli.current());++mgli)
{
mg->countDecMembers();
mg->countDocMembers();
m_numDocMembers+=mg->numDocMembers();
}
}
......
......@@ -29,8 +29,79 @@ class MemberGroupList;
class MemberList : public QList<MemberDef>
{
public:
MemberList();
enum ListType
{
privateLists = 0x0800,
detailedLists = 0x1000,
declarationLists = 0x2000,
documentationLists = 0x4000,
pubMethods = 0,
proMethods = 1,
pacMethods = 2,
priMethods = 3 + privateLists,
pubStaticMethods = 4,
proStaticMethods = 5,
pacStaticMethods = 6,
priStaticMethods = 7 + privateLists,
pubSlots = 8,
proSlots = 9,
priSlots = 10 + privateLists,
pubAttribs = 11,
proAttribs = 12,
pacAttribs = 13,
priAttribs = 14 + privateLists,
pubStaticAttribs = 15,
proStaticAttribs = 16,
pacStaticAttribs = 17,
priStaticAttribs = 18 + privateLists,
pubTypes = 19,
proTypes = 20,
pacTypes = 21,
priTypes = 22 + privateLists,
related = 23,
signals = 24,
friends = 25,
dcopMethods = 26,
properties = 27,
events = 28,
typedefMembers = 29 + detailedLists,
enumMembers = 30 + detailedLists,
enumValMembers = 31 + detailedLists,
functionMembers = 32 + detailedLists,
relatedMembers = 33 + detailedLists,
variableMembers = 34 + detailedLists,
propertyMembers = 35 + detailedLists,
eventMembers = 36 + detailedLists,
constructors = 37 + detailedLists,
allMembersList = 38,
decDefineMembers = 39 + declarationLists,
decProtoMembers = 40 + declarationLists,
decTypedefMembers = 41 + declarationLists,
decEnumMembers = 42 + declarationLists,
decFuncMembers = 43 + declarationLists,
decVarMembers = 44 + declarationLists,
decEnumValMembers = 45 + declarationLists,
docDefineMembers = 46 + documentationLists,
docProtoMembers = 47 + documentationLists,
docTypedefMembers = 48 + documentationLists,
docEnumMembers = 49 + documentationLists,
docFuncMembers = 50 + documentationLists,
docVarMembers = 51 + documentationLists,
docEnumValMembers = 52 + documentationLists,
redefinedBy = 53,
enumFields = 54,
memberGroup = 55
};
MemberList(ListType lt);
~MemberList();
ListType listType() const { return m_listType; }
bool insert(uint index,const MemberDef *md);
void inSort(const MemberDef *md);
void append(const MemberDef *md);
......@@ -71,6 +142,7 @@ class MemberList : public QList<MemberDef>
MemberGroupList *memberGroupList;
bool m_inGroup; // is this list part of a group definition
bool m_inFile; // is this list part of a file definition
ListType m_listType;
};
class MemberListIterator : public QListIterator<MemberDef>
......
This diff is collapsed.
This diff is collapsed.
......@@ -36,6 +36,7 @@ class DotGroupCollaboration;
class DocNode;
class MemberDef;
class GroupDef;
class Definition;
/*! \brief Output interface for code parser.
*/
......@@ -69,6 +70,8 @@ class CodeOutputInterface
virtual void startFontClass(const char *) = 0;
virtual void endFontClass() = 0;
virtual void writeCodeAnchor(const char *name) = 0;
virtual void linkableSymbol(int line,const char *symName,
Definition *symDef,Definition *context) = 0;
};
/*! \brief Base Interface used for generating output outside of the
......
......@@ -391,6 +391,7 @@ class OutputList : public OutputDocInterface
og=outputs->next();
}
}
void linkableSymbol(int,const char *,Definition *,Definition *) {}
private:
void debug();
......
This diff is collapsed.
......@@ -28,5 +28,6 @@ void initPreprocessor();
void cleanUpPreprocessor();
void addSearchDir(const char *dir);
void preprocessFile(const char *fileName,BufStr &output);
void preFreeScanner();
#endif
This diff is collapsed.
This diff is collapsed.
......@@ -54,4 +54,6 @@ class PythonLanguageScanner : public ParserInterface
void parsePrototype(const char *text);
};
void pyscanFreeScanner();
#endif
This diff is collapsed.
......@@ -270,6 +270,7 @@ class RTFGenerator : public OutputGenerator
//void endSectionRefList() {}
void writeCodeAnchor(const char *) {}
void linkableSymbol(int,const char *,Definition *,Definition *) {}
static bool preProcessFileInplace(const char *path,const char *name);
......
......@@ -49,4 +49,6 @@ class CLanguageScanner : public ParserInterface
void parsePrototype(const char *text);
};
void scanFreeScanner();
#endif
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