Commit 161d3860 authored by dimitri's avatar dimitri

Release-1.3.9.1

parent deb9b8d4
...@@ -83,7 +83,6 @@ EXCLUDE = src/code.cpp \ ...@@ -83,7 +83,6 @@ EXCLUDE = src/code.cpp \
src/tag.cpp \ src/tag.cpp \
src/doctokenizer.cpp \ src/doctokenizer.cpp \
src/logos.cpp \ src/logos.cpp \
src/doxysearch.cpp \
src/suffixtree.cpp \ src/suffixtree.cpp \
src/suffixtree.h \ src/suffixtree.h \
src/searchindex.cpp \ src/searchindex.cpp \
......
DOXYGEN Version 1.3.9 DOXYGEN Version 1.3.9.1
Please read the installation section of the manual Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions. (http://www.doxygen.org/install.html) for instructions.
-------- --------
Dimitri van Heesch (05 October 2004) Dimitri van Heesch (10 October 2004)
DOXYGEN Version 1.3.9 DOXYGEN Version 1.3.9.1
Please read INSTALL for compilation instructions. Please read INSTALL for compilation instructions.
...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. ...@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy, Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (05 October 2004) Dimitri van Heesch (dimitri@stack.nl) (10 October 2004)
...@@ -211,11 +211,11 @@ If you don't mind spending some time on it, there are several options: ...@@ -211,11 +211,11 @@ If you don't mind spending some time on it, there are several options:
"input buffer overflow, can't enlarge buffer because scanner uses REJECT"</b> "input buffer overflow, can't enlarge buffer because scanner uses REJECT"</b>
This error happens when doxygen lexical scanner has a rule that matches This error happens when doxygen lexical scanner has a rule that matches
more than 16K of input characters in one go. I've seen this happening more than 256K of input characters in one go. I've seen this happening
on a very large generated file (\>16K lines), where the built-in preprocessor on a very large generated file (\>256K lines), where the built-in preprocessor
converted it into an empty file (with \>16K of newlines). Another case converted it into an empty file (with \>256K of newlines). Another case
where this might happen is if you have lines in your code with more than where this might happen is if you have lines in your code with more than
16K characters. 256K characters.
If you have run into such a case and want me to fix it, you If you have run into such a case and want me to fix it, you
should send me a code fragment that triggers the message. To work around should send me a code fragment that triggers the message. To work around
...@@ -263,6 +263,19 @@ namespace std { ...@@ -263,6 +263,19 @@ namespace std {
I'm still looking for someone who can provide me with definitions I'm still looking for someone who can provide me with definitions
for all (relevant) STL classes. for all (relevant) STL classes.
<li><b>Can I configure doxygen from the command line?</b>
Not via command line options, but doxygen can read from <code>stdin</code>,
so you can pipe things through it. Here's an example how to override an option
in a configuration file from the command line (assuming a unix environment):
\verbatim
( cat Doxyfile ; echo "PROJECT_NUMBER=1.0" ) | doxygen -
\endverbatim
If multiple options with the same name are specified then doxygen will use
the last one. To append to an existing option you can use the += operator.
<li><b>How did doxygen get its name?</b> <li><b>How did doxygen get its name?</b>
Doxygen got its name from playing with the words Doxygen got its name from playing with the words
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
translator report only for some languages, pass their codes as arguments translator report only for some languages, pass their codes as arguments
to the script. In that case, the language.doc will not be generated. to the script. In that case, the language.doc will not be generated.
Example: Example:
python translator.py en nl cz python translator.py en nl cz
Originally, the script was written in Perl and was known as translator.pl. Originally, the script was written in Perl and was known as translator.pl.
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
explicitly via script arguments. explicitly via script arguments.
2004/07/26 - Better reporting of not-needed adapters. 2004/07/26 - Better reporting of not-needed adapters.
2004/10/04 - Reporting of not called translator methods added. 2004/10/04 - Reporting of not called translator methods added.
2004/10/05 - Modified to check only doxygen/src sources for the previous report.
""" """
from __future__ import generators from __future__ import generators
...@@ -1204,7 +1205,7 @@ class TrManager: ...@@ -1204,7 +1205,7 @@ class TrManager:
# script, of the translator.h, of the translator_adapter.h (see the # script, of the translator.h, of the translator_adapter.h (see the
# self.__build() for the last two) of all the translator_xx.h files # self.__build() for the last two) of all the translator_xx.h files
# and of the template for generating the documentation. So, this # and of the template for generating the documentation. So, this
# time can compared with modification time of the generated # time can be compared with modification time of the generated
# documentation to decide, whether the doc should be re-generated. # documentation to decide, whether the doc should be re-generated.
self.lastModificationTime = os.path.getmtime(self.script) self.lastModificationTime = os.path.getmtime(self.script)
...@@ -1361,26 +1362,24 @@ class TrManager: ...@@ -1361,26 +1362,24 @@ class TrManager:
def __getNoTrSourceFilesLst(self): def __getNoTrSourceFilesLst(self):
"""Returns the list of sources to be checked. """Returns the list of sources to be checked.
All .cpp files and also .h files that do not declare and define All .cpp files and also .h files that do not declare or define
the translator methods are included in the list. The file names the translator methods are included in the list. The file names
are searched in doxygen directory recursively.""" are searched in doxygen/src directory.
lst = [] """
for path, dirs, files in os.walk(self.doxy_path): srcdir = os.path.join(self.doxy_path, 'src')
files = []
# Files in doxygen/src should be processed first. for item in os.listdir(srcdir):
if path == self.doxy_path: # Split the bare name to get the extension.
dirs.remove('src') name, ext = os.path.splitext(item)
dirs.insert(0, 'src') ext = ext.lower()
# Search for names with .cpp extension (case independent) # Include only .cpp and .h files (case independent) and exclude
# and append them to the output list. # the files where the checked identifiers are defined.
for fname in files: if ext == '.cpp' or (ext == '.h' and name.find('translator') == -1):
name, ext = os.path.splitext(fname) fname = os.path.join(srcdir, item)
ext = ext.lower() assert os.path.isfile(fname) # assumes no directory with the ext
if ext == '.cpp' or (ext == '.h' and name.find('translator') == -1): files.append(fname) # full name
lst.append(os.path.join(path, fname)) return files
return lst
def __removeUsedInFiles(self, fname, dic): def __removeUsedInFiles(self, fname, dic):
...@@ -1562,12 +1561,12 @@ class TrManager: ...@@ -1562,12 +1561,12 @@ class TrManager:
if not self.script_argLst: if not self.script_argLst:
dic = self.__checkForNotUsedTrMethods() dic = self.__checkForNotUsedTrMethods()
if dic: if dic:
s = '''WARNING FOR DEVELOPERS: The following translator s = '''WARNING: The following translator methods are declared
methods are declared in the Translator class but their in the Translator class but their identifiers do not appear
identifiers do not appear in source files. The situation in source files. The situation should be checked. The .cpp
should be checked. The .cpp files and .h files excluding files and .h files excluding the '*translator*' files
the 'translator*.h' files were simply searched for in doxygen/src directory were simply searched for occurence
occurence of the method identifiers:''' of the method identifiers:'''
f.write('\n' + '=' * 70 + '\n') f.write('\n' + '=' * 70 + '\n')
f.write(fill(s) + '\n\n') f.write(fill(s) + '\n\n')
......
...@@ -64,6 +64,25 @@ version of the translator for the language: ...@@ -64,6 +64,25 @@ version of the translator for the language:
TranslatorJapaneseEn implements 5 methods TranslatorJapaneseEn implements 5 methods
TranslatorKoreanEn implements 5 methods TranslatorKoreanEn implements 5 methods
======================================================================
WARNING: The following translator methods are declared in the
Translator class but their identifiers do not appear in source files.
The situation should be checked. The .cpp files and .h files excluding
the '*translator*' files in doxygen/src directory were simply searched
for occurence of the method identifiers:
QCString trBugsAndLimitations()
QCString trEnumerationValueDocumentation()
QCString trField(bool, bool)
QCString trHeaderFiles()
QCString trHeaderFilesDescription()
QCString trInterfaces()
QCString trNoDescriptionAvailable()
QCString trPackageDocumentation()
QCString trReimplementedForInternalReasons()
QCString trSources()
====================================================================== ======================================================================
Details for translators (classes sorted alphabetically): Details for translators (classes sorted alphabetically):
......
Summary: A documentation system for C/C++. Summary: A documentation system for C/C++.
Name: doxygen Name: doxygen
Version: 1.3.9 Version: 1.3.9.1
Release: 1 Release: 1
Epoch: 1 Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
......
...@@ -843,18 +843,18 @@ static void generateClassOrGlobalLink(BaseCodeDocInterface &ol,char *clName, ...@@ -843,18 +843,18 @@ static void generateClassOrGlobalLink(BaseCodeDocInterface &ol,char *clName,
} }
} }
static bool getLink(const char *className, static bool getLinkInScope(const QCString &c, // scope
const char *memberName, const QCString &m, // member
BaseCodeDocInterface &ol, const char *memberText, // exact text
const char *text=0) BaseCodeDocInterface &ol,
const char *text
)
{ {
MemberDef *md; MemberDef *md;
ClassDef *cd; ClassDef *cd;
FileDef *fd; FileDef *fd;
NamespaceDef *nd; NamespaceDef *nd;
GroupDef *gd; GroupDef *gd;
QCString m=removeRedundantWhiteSpace(memberName);
QCString c=className;
//printf("Trying `%s'::`%s'\n",c.data(),m.data()); //printf("Trying `%s'::`%s'\n",c.data(),m.data());
if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) && if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) &&
md->isLinkable()) md->isLinkable())
...@@ -894,14 +894,34 @@ static bool getLink(const char *className, ...@@ -894,14 +894,34 @@ static bool getLink(const char *className,
writeMultiLineCodeLink(ol,md->getReference(), writeMultiLineCodeLink(ol,md->getReference(),
md->getOutputFileBase(), md->getOutputFileBase(),
md->anchor(), md->anchor(),
text ? text : memberName); text ? text : memberText);
addToSearchIndex(text ? text : memberName); addToSearchIndex(text ? text : memberText);
return TRUE; return TRUE;
} }
} }
return FALSE; return FALSE;
} }
static bool getLink(const char *className,
const char *memberName,
BaseCodeDocInterface &ol,
const char *text=0)
{
QCString m=removeRedundantWhiteSpace(memberName);
QCString c=className;
if (!getLinkInScope(c,m,memberName,ol,text))
{
if (!g_curClassName.isEmpty())
{
if (!c.isEmpty()) c.prepend("::");
c.prepend(g_curClassName);
return getLinkInScope(c,m,memberName,ol,text);
}
return FALSE;
}
return TRUE;
}
static bool generateClassMemberLink(BaseCodeDocInterface &ol,ClassDef *mcd,const char *memName) static bool generateClassMemberLink(BaseCodeDocInterface &ol,ClassDef *mcd,const char *memName)
{ {
if (mcd) if (mcd)
...@@ -1761,7 +1781,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) ...@@ -1761,7 +1781,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
BEGIN( Body ); BEGIN( Body );
} }
<ClassName,ClassVar>[*&]+ { <ClassName,ClassVar>[*&]+ {
g_type=g_curClassName; g_type=g_curClassName.copy();
g_name.resize(0); g_name.resize(0);
g_code->codify(yytext); g_code->codify(yytext);
BEGIN( Body ); // variable of type struct * BEGIN( Body ); // variable of type struct *
......
...@@ -164,7 +164,9 @@ void Definition::writeDocAnchorsToTagFile() ...@@ -164,7 +164,9 @@ void Definition::writeDocAnchorsToTagFile()
{ {
//printf("write an entry!\n"); //printf("write an entry!\n");
if (definitionType()==TypeMember) Doxygen::tagFile << " "; if (definitionType()==TypeMember) Doxygen::tagFile << " ";
Doxygen::tagFile << " <docanchor>" << si->label << "</docanchor>" << endl; Doxygen::tagFile << " <docanchor file=\""
<< si->fileName << "\">" << si->label
<< "</docanchor>" << endl;
} }
} }
} }
......
...@@ -1021,11 +1021,13 @@ static void buildNamespaceList(Entry *root) ...@@ -1021,11 +1021,13 @@ static void buildNamespaceList(Entry *root)
else // fresh namespace else // fresh namespace
{ {
QCString tagName; QCString tagName;
QCString tagFileName;
if (root->tagInfo) if (root->tagInfo)
{ {
tagName=root->tagInfo->tagName; tagName=root->tagInfo->tagName;
tagFileName=root->tagInfo->fileName;
} }
NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,fullName,tagName); NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,fullName,tagName,tagFileName);
nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
nd->setBriefDescription(root->brief,root->briefFile,root->briefLine); nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
nd->addSectionsToDefinition(root->anchors); nd->addSectionsToDefinition(root->anchors);
...@@ -1143,8 +1145,7 @@ static void findUsingDirectives(Entry *root) ...@@ -1143,8 +1145,7 @@ static void findUsingDirectives(Entry *root)
} }
else // unknown namespace, but add it anyway. else // unknown namespace, but add it anyway.
{ {
NamespaceDef *nd=new NamespaceDef( NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,name);
root->fileName,root->startLine,name);
nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
nd->setBriefDescription(root->brief,root->briefFile,root->briefLine); nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
nd->addSectionsToDefinition(root->anchors); nd->addSectionsToDefinition(root->anchors);
...@@ -4241,6 +4242,49 @@ static bool findGlobalMember(Entry *root, ...@@ -4241,6 +4242,49 @@ static bool findGlobalMember(Entry *root,
return TRUE; return TRUE;
} }
static QCString substituteTemplatesInString(
const QList<ArgumentList> &srcTempArgLists,
const QList<ArgumentList> &dstTempArgLists,
const QCString &src
)
{
QCString dst;
QRegExp re(idMask);
//printf("type=%s\n",sa->type.data());
int i,p=0,l;
while ((i=re.match(src,p,&l))!=-1) // for each word in srcType
{
bool found=FALSE;
dst+=src.mid(p,i-p);
QCString name=src.mid(i,l);
QListIterator<ArgumentList> srclali(srcTempArgLists);
QListIterator<ArgumentList> dstlali(dstTempArgLists);
for (;srclali.current() && !found;++srclali,++dstlali)
{
ArgumentListIterator tsali(*srclali.current());
ArgumentListIterator tdali(*dstlali.current());
Argument *tsa =0,*tda=0;
for (tsali.toFirst();(tsa=tsali.current()) && !found;++tsali)
{
tda = tdali.current();
if (tda && name==tsa->name)
{
name=tda->name; // substitute
found=TRUE;
}
if (tda) ++tdali;
}
}
dst+=name;
p=i+l;
}
dst+=src.right(src.length()-p);
return dst;
}
static void substituteTemplatesInArgList( static void substituteTemplatesInArgList(
const QList<ArgumentList> &srcTempArgLists, const QList<ArgumentList> &srcTempArgLists,
const QList<ArgumentList> &dstTempArgLists, const QList<ArgumentList> &dstTempArgLists,
...@@ -4253,51 +4297,22 @@ static void substituteTemplatesInArgList( ...@@ -4253,51 +4297,22 @@ static void substituteTemplatesInArgList(
for (sali.toFirst();(sa=sali.current());++sali) // for each member argument for (sali.toFirst();(sa=sali.current());++sali) // for each member argument
{ {
QCString srcType = sa->type; QCString dstType = substituteTemplatesInString(
QRegExp re(idMask); srcTempArgLists,dstTempArgLists,sa->type);
//printf("type=%s\n",sa->type.data()); QCString dstArray = substituteTemplatesInString(
srcTempArgLists,dstTempArgLists,sa->array);
int i,p=0,l;
QCString dstType;
while ((i=re.match(srcType,p,&l))!=-1) // for each word in srcType
{
bool found=FALSE;
dstType+=srcType.mid(p,i-p);
QCString name=srcType.mid(i,l);
QListIterator<ArgumentList> srclali(srcTempArgLists);
QListIterator<ArgumentList> dstlali(dstTempArgLists);
for (;srclali.current() && !found;++srclali,++dstlali)
{
ArgumentListIterator tsali(*srclali.current());
ArgumentListIterator tdali(*dstlali.current());
Argument *tsa =0,*tda=0;
for (tsali.toFirst();(tsa=tsali.current()) && !found;++tsali)
{
tda = tdali.current();
if (tda && name==tsa->name)
{
name=tda->name; // substitute
found=TRUE;
}
if (tda) ++tdali;
}
}
dstType+=name;
p=i+l;
}
dstType+=srcType.right(srcType.length()-p);
if (da==0) if (da==0)
{ {
da=new Argument(*sa); da=new Argument(*sa);
dst->append(da); dst->append(da);
da->type=dstType; da->type=dstType;
da->array=dstArray;
da=0; da=0;
} }
else else
{ {
da->type=dstType; da->type=dstType;
da->type=dstArray;
da=dst->next(); da=dst->next();
} }
} }
......
...@@ -1145,7 +1145,7 @@ void HtmlGenerator::startParameterType(bool first,const char *key) ...@@ -1145,7 +1145,7 @@ void HtmlGenerator::startParameterType(bool first,const char *key)
t << " <td class=\"md\" nowrap align=\"right\">"; t << " <td class=\"md\" nowrap align=\"right\">";
if (key) t << key; if (key) t << key;
t << "</td>" << endl; t << "</td>" << endl;
t << " <td></td>" << endl; t << " <td class=\"md\"></td>" << endl;
t << " <td class=\"md\" nowrap>"; t << " <td class=\"md\" nowrap>";
} }
} }
...@@ -1185,7 +1185,7 @@ void HtmlGenerator::endParameterName(bool last,bool emptyList,bool closeBracket) ...@@ -1185,7 +1185,7 @@ void HtmlGenerator::endParameterName(bool last,bool emptyList,bool closeBracket)
t << "</td>" << endl; t << "</td>" << endl;
t << " </tr>" << endl; t << " </tr>" << endl;
t << " <tr>" << endl; t << " <tr>" << endl;
t << " <td></td>" << endl; t << " <td class=\"md\"></td>" << endl;
t << " <td class=\"md\">"; t << " <td class=\"md\">";
if (closeBracket) t << ")"; if (closeBracket) t << ")";
t << "&nbsp;</td>" << endl; t << "&nbsp;</td>" << endl;
......
...@@ -29,11 +29,19 @@ ...@@ -29,11 +29,19 @@
#include "searchindex.h" #include "searchindex.h"
NamespaceDef::NamespaceDef(const char *df,int dl, NamespaceDef::NamespaceDef(const char *df,int dl,
const char *name,const char *lref) : const char *name,const char *lref,
const char *fName) :
Definition(df,dl,name) Definition(df,dl,name)
{ {
fileName="namespace"; if (fName)
fileName+=name; {
fileName = stripExtension(fName);
}
else
{
fileName="namespace";
fileName+=name;
}
classSDict = new ClassSDict(17); classSDict = new ClassSDict(17);
namespaceSDict = new NamespaceSDict(17); namespaceSDict = new NamespaceSDict(17);
m_innerCompounds = new SDict<Definition>(257); m_innerCompounds = new SDict<Definition>(257);
...@@ -414,7 +422,14 @@ void NamespaceDef::addUsingDeclaration(Definition *d) ...@@ -414,7 +422,14 @@ void NamespaceDef::addUsingDeclaration(Definition *d)
QCString NamespaceDef::getOutputFileBase() const QCString NamespaceDef::getOutputFileBase() const
{ {
return convertNameToFile(fileName); if (isReference())
{
return fileName;
}
else
{
return convertNameToFile(fileName);
}
} }
Definition *NamespaceDef::findInnerCompound(const char *n) Definition *NamespaceDef::findInnerCompound(const char *n)
......
...@@ -38,7 +38,8 @@ class NamespaceDef : public Definition ...@@ -38,7 +38,8 @@ class NamespaceDef : public Definition
{ {
public: public:
NamespaceDef(const char *defFileName,int defLine, NamespaceDef(const char *defFileName,int defLine,
const char *name,const char *ref=0); const char *name,const char *ref=0,
const char *refFile=0);
~NamespaceDef(); ~NamespaceDef();
DefType definitionType() { return TypeNamespace; } DefType definitionType() { return TypeNamespace; }
QCString getOutputFileBase() const; QCString getOutputFileBase() const;
......
...@@ -856,9 +856,15 @@ QCString removeIdsAndMarkers(const char *s) ...@@ -856,9 +856,15 @@ QCString removeIdsAndMarkers(const char *s)
} }
p++; p++;
} }
else // oops, not comment but division
{
result+=pc;
goto nextChar;
}
} }
else else
{ {
nextChar:
result+=c; result+=c;
char lc=tolower(c); char lc=tolower(c);
if (!isId(lc) && lc!='.' && lc!='-' && lc!='+') inNum=FALSE; if (!isId(lc) && lc!='.' && lc!='-' && lc!='+') inNum=FALSE;
...@@ -1507,6 +1513,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ...@@ -1507,6 +1513,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
<Guard>"defined"/{B}+ { <Guard>"defined"/{B}+ {
BEGIN(DefinedExpr1); BEGIN(DefinedExpr1);
} }
<Guard>{ID} { g_guardExpr+=yytext; }
<Guard>. { g_guardExpr+=*yytext; } <Guard>. { g_guardExpr+=*yytext; }
<Guard>\n { <Guard>\n {
outputChar('\n'); outputChar('\n');
......
...@@ -35,6 +35,22 @@ ...@@ -35,6 +35,22 @@
#include "defargs.h" #include "defargs.h"
//#include "reflist.h" //#include "reflist.h"
/*! Information about an linkable anchor */
class TagAnchorInfo
{
public:
TagAnchorInfo(const QString &f,const QString &l) : label(l), fileName(f) {}
QString label;
QString fileName;
};
class TagAnchorInfoList : public QList<TagAnchorInfo>
{
public:
TagAnchorInfoList() : QList<TagAnchorInfo>() { setAutoDelete(TRUE); }
virtual ~TagAnchorInfoList() {}
};
/*! Container for member specific info that can be read from a tagfile */ /*! Container for member specific info that can be read from a tagfile */
class TagMemberInfo class TagMemberInfo
{ {
...@@ -45,7 +61,7 @@ class TagMemberInfo ...@@ -45,7 +61,7 @@ class TagMemberInfo
QString anchor; QString anchor;
QString arglist; QString arglist;
QString kind; QString kind;
QStrList docAnchors; TagAnchorInfoList docAnchors;
Protection prot; Protection prot;
Specifier virt; Specifier virt;
bool isStatic; bool isStatic;
...@@ -60,7 +76,7 @@ class TagClassInfo ...@@ -60,7 +76,7 @@ class TagClassInfo
~TagClassInfo() { delete bases; delete templateArguments; } ~TagClassInfo() { delete bases; delete templateArguments; }
QString name; QString name;
QString filename; QString filename;
QStrList docAnchors; TagAnchorInfoList docAnchors;
QList<BaseInfo> *bases; QList<BaseInfo> *bases;
QList<TagMemberInfo> members; QList<TagMemberInfo> members;
QList<QString> *templateArguments; QList<QString> *templateArguments;
...@@ -75,7 +91,7 @@ class TagNamespaceInfo ...@@ -75,7 +91,7 @@ class TagNamespaceInfo
TagNamespaceInfo() { members.setAutoDelete(TRUE); } TagNamespaceInfo() { members.setAutoDelete(TRUE); }
QString name; QString name;
QString filename; QString filename;
QStrList docAnchors; TagAnchorInfoList docAnchors;
QList<TagMemberInfo> members; QList<TagMemberInfo> members;
QStringList classList; QStringList classList;
}; };
...@@ -87,7 +103,7 @@ class TagPackageInfo ...@@ -87,7 +103,7 @@ class TagPackageInfo
TagPackageInfo() { members.setAutoDelete(TRUE); } TagPackageInfo() { members.setAutoDelete(TRUE); }
QString name; QString name;
QString filename; QString filename;
QStrList docAnchors; TagAnchorInfoList docAnchors;
QList<TagMemberInfo> members; QList<TagMemberInfo> members;
QStringList classList; QStringList classList;
}; };
...@@ -110,7 +126,7 @@ class TagFileInfo ...@@ -110,7 +126,7 @@ class TagFileInfo
QString name; QString name;
QString path; QString path;
QString filename; QString filename;
QStrList docAnchors; TagAnchorInfoList docAnchors;
QList<TagMemberInfo> members; QList<TagMemberInfo> members;
QStringList classList; QStringList classList;
QStringList namespaceList; QStringList namespaceList;
...@@ -125,7 +141,7 @@ class TagGroupInfo ...@@ -125,7 +141,7 @@ class TagGroupInfo
QString name; QString name;
QString title; QString title;
QString filename; QString filename;
QStrList docAnchors; TagAnchorInfoList docAnchors;
QList<TagMemberInfo> members; QList<TagMemberInfo> members;
QStringList subgroupList; QStringList subgroupList;
QStringList classList; QStringList classList;
...@@ -142,7 +158,7 @@ class TagPageInfo ...@@ -142,7 +158,7 @@ class TagPageInfo
QString name; QString name;
QString title; QString title;
QString filename; QString filename;
QStrList docAnchors; TagAnchorInfoList docAnchors;
}; };
/*! Container for directory specific info that can be read from a tagfile */ /*! Container for directory specific info that can be read from a tagfile */
...@@ -154,7 +170,7 @@ class TagDirInfo ...@@ -154,7 +170,7 @@ class TagDirInfo
QString path; QString path;
QStringList subdirList; QStringList subdirList;
QStringList fileList; QStringList fileList;
QStrList docAnchors; TagAnchorInfoList docAnchors;
}; };
/*! Tag file parser. /*! Tag file parser.
...@@ -317,8 +333,8 @@ class TagFileParser : public QXmlDefaultHandler ...@@ -317,8 +333,8 @@ class TagFileParser : public QXmlDefaultHandler
{ {
m_curMember = new TagMemberInfo; m_curMember = new TagMemberInfo;
m_curMember->kind = attrib.value("kind"); m_curMember->kind = attrib.value("kind");
QString protStr = attrib.value("protection"); QString protStr = attrib.value("protection");
QString virtStr = attrib.value("virtualness"); QString virtStr = attrib.value("virtualness");
QString staticStr = attrib.value("static"); QString staticStr = attrib.value("static");
if (protStr=="protected") if (protStr=="protected")
{ {
...@@ -364,14 +380,14 @@ class TagFileParser : public QXmlDefaultHandler ...@@ -364,14 +380,14 @@ class TagFileParser : public QXmlDefaultHandler
{ {
switch(m_state) switch(m_state)
{ {
case InClass: m_curClass->docAnchors.append(m_curString); break; case InClass: m_curClass->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
case InFile: m_curFile->docAnchors.append(m_curString); break; case InFile: m_curFile->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
case InNamespace: m_curNamespace->docAnchors.append(m_curString); break; case InNamespace: m_curNamespace->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
case InGroup: m_curGroup->docAnchors.append(m_curString); break; case InGroup: m_curGroup->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
case InPage: m_curPage->docAnchors.append(m_curString); break; case InPage: m_curPage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
case InMember: m_curMember->docAnchors.append(m_curString); break; case InMember: m_curMember->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
case InPackage: m_curPackage->docAnchors.append(m_curString); break; case InPackage: m_curPackage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
case InDir: m_curDir->docAnchors.append(m_curString); break; case InDir: m_curDir->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
default: err("Error: Unexpected tag `member' found\n"); break; default: err("Error: Unexpected tag `member' found\n"); break;
} }
} }
...@@ -424,6 +440,11 @@ class TagFileParser : public QXmlDefaultHandler ...@@ -424,6 +440,11 @@ class TagFileParser : public QXmlDefaultHandler
{ {
m_curString = ""; m_curString = "";
} }
void startDocAnchor(const QXmlAttributes& attrib )
{
m_fileName = attrib.value("file");
m_curString = "";
}
void endType() void endType()
{ {
if (m_state==InMember) if (m_state==InMember)
...@@ -640,7 +661,7 @@ class TagFileParser : public QXmlDefaultHandler ...@@ -640,7 +661,7 @@ class TagFileParser : public QXmlDefaultHandler
m_startElementHandlers.insert("file", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("file", new StartElementHandler(this,&TagFileParser::startStringValue));
m_startElementHandlers.insert("dir", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("dir", new StartElementHandler(this,&TagFileParser::startStringValue));
m_startElementHandlers.insert("page", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("page", new StartElementHandler(this,&TagFileParser::startStringValue));
m_startElementHandlers.insert("docanchor", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("docanchor", new StartElementHandler(this,&TagFileParser::startDocAnchor));
m_startElementHandlers.insert("tagfile", new StartElementHandler(this,&TagFileParser::startIgnoreElement)); m_startElementHandlers.insert("tagfile", new StartElementHandler(this,&TagFileParser::startIgnoreElement));
m_startElementHandlers.insert("templarg", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("templarg", new StartElementHandler(this,&TagFileParser::startStringValue));
m_startElementHandlers.insert("type", new StartElementHandler(this,&TagFileParser::startStringValue)); m_startElementHandlers.insert("type", new StartElementHandler(this,&TagFileParser::startStringValue));
...@@ -708,7 +729,7 @@ class TagFileParser : public QXmlDefaultHandler ...@@ -708,7 +729,7 @@ class TagFileParser : public QXmlDefaultHandler
private: private:
void buildMemberList(Entry *ce,QList<TagMemberInfo> &members); void buildMemberList(Entry *ce,QList<TagMemberInfo> &members);
void addDocAnchors(Entry *e,QStrList &l); void addDocAnchors(Entry *e,const TagAnchorInfoList &l);
QList<TagClassInfo> m_tagFileClasses; QList<TagClassInfo> m_tagFileClasses;
QList<TagFileInfo> m_tagFileFiles; QList<TagFileInfo> m_tagFileFiles;
QList<TagNamespaceInfo> m_tagFileNamespaces; QList<TagNamespaceInfo> m_tagFileNamespaces;
...@@ -729,6 +750,7 @@ class TagFileParser : public QXmlDefaultHandler ...@@ -729,6 +750,7 @@ class TagFileParser : public QXmlDefaultHandler
TagIncludeInfo *m_curIncludes; TagIncludeInfo *m_curIncludes;
QCString m_curString; QCString m_curString;
QString m_tagName; QString m_tagName;
QString m_fileName;
State m_state; State m_state;
QStack<State> m_stateStack; QStack<State> m_stateStack;
}; };
...@@ -932,24 +954,25 @@ void TagFileParser::dump() ...@@ -932,24 +954,25 @@ void TagFileParser::dump()
} }
} }
void TagFileParser::addDocAnchors(Entry *e,QStrList &l) void TagFileParser::addDocAnchors(Entry *e,const TagAnchorInfoList &l)
{ {
char *s=l.first(); QListIterator<TagAnchorInfo> tli(l);
while (s) TagAnchorInfo *ta;
for (tli.toFirst();(ta=tli.current());++tli)
{ {
QCString *anchorName = new QCString(s); if (Doxygen::sectionDict.find(ta->label)==0)
if (Doxygen::sectionDict.find(*anchorName)==0)
{ {
SectionInfo *si=new SectionInfo(e->fileName,*anchorName,*anchorName, //printf("New sectionInfo file=%s anchor=%s\n",
// ta->fileName.data(),ta->label.data());
SectionInfo *si=new SectionInfo(ta->fileName,ta->label,ta->label,
SectionInfo::Anchor,m_tagName); SectionInfo::Anchor,m_tagName);
Doxygen::sectionDict.insert(*anchorName,si); Doxygen::sectionDict.insert(ta->label,si);
e->anchors->append(si); e->anchors->append(si);
} }
else else
{ {
err("Duplicate anchor %s found\n",anchorName->data()); err("Duplicate anchor %s found\n",ta->label.data());
} }
s=l.next();
} }
} }
......
...@@ -128,23 +128,31 @@ int iSystem(const char *command,const char *args,bool isBatchFile) ...@@ -128,23 +128,31 @@ int iSystem(const char *command,const char *args,bool isBatchFile)
{ {
QTime time; QTime time;
time.start(); time.start();
if (command==0) return 1;
QCString fullCmd=command;
fullCmd=fullCmd.stripWhiteSpace();
if (fullCmd.at(0)!='"' && fullCmd.find(' ')!=-1)
{
// add quotes around command as it contains spaces and is not quoted already
fullCmd="\""+fullCmd+"\"";
}
fullCmd += " ";
fullCmd += args;
//printf("iSystem: Executing %s\n",fullCmd.data());
#if !defined(_WIN32) || defined(__CYGWIN__) #if !defined(_WIN32) || defined(__CYGWIN__)
isBatchFile=isBatchFile; isBatchFile=isBatchFile;
/*! taken from the system() manpage on my Linux box */ /*! taken from the system() manpage on my Linux box */
int pid,status=0; int pid,status=0;
if (command==0) return 1;
#ifdef _OS_SOLARIS // for Solaris we use vfork since it is more memory efficient #ifdef _OS_SOLARIS // for Solaris we use vfork since it is more memory efficient
// on Solaris fork() duplicates the memory usage // on Solaris fork() duplicates the memory usage
// so we use vfork instead // so we use vfork instead
char buf[4096];
strcpy(buf,command);
strcat(buf," ");
strcat(buf,args);
// spawn shell // spawn shell
if ((pid=vfork())<0) if ((pid=vfork())<0)
{ {
...@@ -152,7 +160,7 @@ int iSystem(const char *command,const char *args,bool isBatchFile) ...@@ -152,7 +160,7 @@ int iSystem(const char *command,const char *args,bool isBatchFile)
} }
else if (pid==0) else if (pid==0)
{ {
execl("/bin/sh","sh","-c",buf,(char*)0); execl("/bin/sh","sh","-c",fullCmd.data(),(char*)0);
_exit(127); _exit(127);
} }
else else
...@@ -175,14 +183,10 @@ int iSystem(const char *command,const char *args,bool isBatchFile) ...@@ -175,14 +183,10 @@ int iSystem(const char *command,const char *args,bool isBatchFile)
if (pid==-1) return -1; if (pid==-1) return -1;
if (pid==0) if (pid==0)
{ {
char buf[4096];
strcpy(buf,command);
strcat(buf," ");
strcat(buf,args);
const char * argv[4]; const char * argv[4];
argv[0] = "sh"; argv[0] = "sh";
argv[1] = "-c"; argv[1] = "-c";
argv[2] = buf; argv[2] = fullCmd.data();
argv[3] = 0; argv[3] = 0;
execve("/bin/sh",(char * const *)argv,environ); execve("/bin/sh",(char * const *)argv,environ);
exit(127); exit(127);
...@@ -204,9 +208,6 @@ int iSystem(const char *command,const char *args,bool isBatchFile) ...@@ -204,9 +208,6 @@ int iSystem(const char *command,const char *args,bool isBatchFile)
#else // Win32 specific #else // Win32 specific
if (isBatchFile) if (isBatchFile)
{ {
QCString fullCmd = command;
fullCmd += " ";
fullCmd += args;
return system(fullCmd); return system(fullCmd);
} }
else else
...@@ -1107,7 +1108,7 @@ ClassDef *getResolvedClassRec(Definition *scope, ...@@ -1107,7 +1108,7 @@ ClassDef *getResolvedClassRec(Definition *scope,
bestTemplSpec.resize(0); bestTemplSpec.resize(0);
} }
else if (distance==minDistance && else if (distance==minDistance &&
fileScope && fileScope && bestMatch &&
fileScope->getUsedNamespaces() && fileScope->getUsedNamespaces() &&
d->getOuterScope()->definitionType()==Definition::TypeNamespace && d->getOuterScope()->definitionType()==Definition::TypeNamespace &&
bestMatch->getOuterScope()==Doxygen::globalScope bestMatch->getOuterScope()==Doxygen::globalScope
...@@ -1143,10 +1144,14 @@ ClassDef *getResolvedClassRec(Definition *scope, ...@@ -1143,10 +1144,14 @@ ClassDef *getResolvedClassRec(Definition *scope,
{ {
QCString spec; QCString spec;
minDistance=distance; minDistance=distance;
bestMatch = newResolveTypedef(fileScope,md,&spec); ClassDef *cd = newResolveTypedef(fileScope,md,&spec);
//printf(" bestTypeDef=%p spec=%s\n",md,spec.data()); if (cd) // shouldn't be 0, but could in some weird cases
bestTypedef = md; {
bestTemplSpec = spec; //printf(" bestTypeDef=%p spec=%s\n",md,spec.data());
bestMatch = cd;
bestTypedef = md;
bestTemplSpec = spec;
}
} }
} }
} }
......
...@@ -23,6 +23,8 @@ CFG=Doxygen - Win32 Debug ...@@ -23,6 +23,8 @@ CFG=Doxygen - Win32 Debug
# Begin Project # Begin Project
# PROP AllowPerConfigDependencies 0 # PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe CPP=cl.exe
RSC=rc.exe RSC=rc.exe
...@@ -151,6 +153,10 @@ SOURCE=..\src\diagram.cpp ...@@ -151,6 +153,10 @@ SOURCE=..\src\diagram.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\src\dirdef.cpp
# End Source File
# Begin Source File
SOURCE=..\src\docparser.cpp SOURCE=..\src\docparser.cpp
# End Source File # End Source File
# Begin Source File # Begin Source File
...@@ -415,6 +421,10 @@ SOURCE=..\src\diagram.h ...@@ -415,6 +421,10 @@ SOURCE=..\src\diagram.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\src\dirdef.h
# End Source File
# Begin Source File
SOURCE=..\src\docparser.h SOURCE=..\src\docparser.h
# End Source File # End Source File
# Begin Source File # Begin Source File
......
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