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

Release-1.3.8-20040803

parent d7bf5675
......@@ -166,7 +166,7 @@ MAN_LINKS = NO
#---------------------------------------------------------------------------
# configuration options related to the XML output
#---------------------------------------------------------------------------
GENERATE_XML = YES
GENERATE_XML = NO
XML_OUTPUT = xml
XML_SCHEMA =
XML_DTD =
......
DOXYGEN Version 1.3.8
DOXYGEN Version 1.3.8-20040803
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (25 July 2004)
Dimitri van Heesch (03 August 2004)
......@@ -13,6 +13,7 @@ irix-g++
irix-n32
linux-g++
macosx-c++
m68k-atari-mint-g++
netbsd-g++
openbsd-g++
osf1-cxx
......
DOXYGEN Version 1.3.8
DOXYGEN Version 1.3.8_20040803
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) (25 July 2004)
Dimitri van Heesch (dimitri@stack.nl) (03 August 2004)
1.3.8
1.3.8-20040803
......@@ -850,7 +850,7 @@ void MainWidget::launchWizard()
// step1
wizard.setProjectName(Config_getString("PROJECT_NAME"));
wizard.setProjectNumber(Config_getString("PROJECT_NUMBER"));
if (Config_getList("INPUT").count()==1)
if (Config_getList("INPUT").count()>0)
{
QString dirName=Config_getList("INPUT").getFirst();
QFileInfo fi(dirName);
......@@ -1109,6 +1109,8 @@ void MainWidget::loadConfigFile()
if (!fn.isEmpty())
{
loadConfigFromFile(fn);
// set current dir to where the config file is located
QDir::setCurrent(QFileInfo(fn).dirPath(TRUE));
}
}
......
......@@ -194,6 +194,9 @@ if test -z "$f_platform"; then
Cygwin:*)
f_platform=win32-g++
;;
*MiNT:*)
f_platform=m68k-atari-mint-g++
;;
*)
echo
echo "Your platform was not recognised by this configure script"
......@@ -431,6 +434,13 @@ HAVE_DOT = $f_dot
EOF
fi
if test "$f_platform" = "m68k-atari-mint-g++"; then
cat >> .makeconfig <<EOF
TMAKE += -unix
EOF
fi
touch .tmakeconfig
if test "$f_shared" = NO; then
if test "$f_platform" = "osf1-cxx" -o "$f_platform" = "irix-n32"; then
......@@ -526,8 +536,7 @@ done
echo -n " Generating src/lang_cfg.h..."
echo $f_langs | $f_perl -e '@l=split(/,/,<STDIN>);
chomp @l;
@allowed=(NL,SE,CZ,FR,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);
@allowed=(split(/,/,"NL,SE,CZ,FR,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"));
foreach my $elem (@l){
$elem =~ tr/a-z/A-Z/;
$r=0;
......
......@@ -33,10 +33,9 @@ CASE_SENSE_NAMES = NO
IMAGE_PATH = .
INPUT = index.doc install.doc starting.doc docblocks.doc lists.doc \
grouping.doc formulas.doc diagrams.doc preprocessing.doc \
external.doc faq.doc trouble.doc history.doc features.doc \
autolink.doc output.doc external.doc faq.doc trouble.doc history.doc features.doc \
doxygen_usage.doc doxytag_usage.doc \
doxywizard_usage.doc \
installdox_usage.doc output.doc autolink.doc \
doxywizard_usage.doc installdox_usage.doc \
config.doc commands.doc htmlcmds.doc language.doc \
perlmod.doc perlmod_tree.doc arch.doc
FILE_PATTERNS = *.cpp *.h *.doc
......
......@@ -54,6 +54,8 @@ Written by Dimitri van Heesch\\[2ex]
\input{formulas}
\input{diagrams}
\input{preprocessing}
\input{autolink}
\input{output}
\input{external}
\input{faq}
\input{trouble}
......@@ -64,8 +66,6 @@ Written by Dimitri van Heesch\\[2ex]
\input{doxytag_usage}
\input{doxywizard_usage}
\input{installdox_usage}
\input{output}
\input{autolink}
\input{config}
\input{commands}
\input{htmlcmds}
......
......@@ -71,6 +71,10 @@ The first part forms a user manual:
<li>Section \ref formulas shows how to insert formulas in the documentation.
<li>Section \ref diagrams describes the diagrams and graphs that doxygen can generate.
<li>Section \ref preprocessing explains how doxygen deals with macro definitions.
<li>Section \ref autolink shows how to put links to files, classes,
and members in the documentation.
<li>Section \ref output shows how to generate the various output formats
supported by doxygen.
<li>Section \ref external explains how to let doxygen create links to externally generated documentation.
<li>Section \ref faq gives answers to frequently asked questions.
<li>Section \ref trouble tells you what to do when you have problems.
......@@ -87,10 +91,6 @@ The second part forms a reference manual:
<li>Section \ref doxywizard_usage shows how to use the \c doxywizard program.
<li>Section \ref installdox_usage shows how to use the \c installdox
script that is generated by doxygen if you use tag files.
<li>Section \ref output shows how to generate the various output formats
supported by doxygen.
<li>Section \ref autolink shows how to put links to files, classes,
and members in the documentation.
<li>Section \ref config shows how to fine-tune doxygen, so it
generates the documentation you want.
<li>Section \ref commands shows an overview of the special commands that can be
......
......@@ -23,7 +23,7 @@ text fragments, generated by doxygen, can be produced in languages other
than English (the default). The output language is chosen through the
configuration file (with default name and known as Doxyfile).
Currently (version 1.3.7-20040719), 30 languages
Currently (version 1.3.8), 30 languages
are supported (sorted alphabetically):
Afrikaans, Brazilian Portuguese, Catalan, Chinese, Chinese
Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French,
......@@ -72,7 +72,7 @@ when the translator was updated.
<td>Chinese</td>
<td>Li Daobing<br>Wei Liu</td>
<td>lidaobing at gmail dot com<br>liuwei at asiainfo dot com</td>
<td>1.3.08</td>
<td>up-to-date</td>
</tr>
<tr bgcolor="#ffffff">
<td>Chinese Traditional</td>
......@@ -126,7 +126,7 @@ when the translator was updated.
<td>German</td>
<td>Jens Seidel</td>
<td>jensseidel at users dot sf dot net</td>
<td>1.3.8</td>
<td>up-to-date</td>
</tr>
<tr bgcolor="#ffffff">
<td>Greek</td>
......@@ -234,7 +234,7 @@ when the translator was updated.
<td>Swedish</td>
<td>Mikael Hallin</td>
<td>mikaelhallin at yahoo dot se</td>
<td>1.3.3</td>
<td>1.3.8</td>
</tr>
<tr bgcolor="#ffffff">
<td>Ukrainian</td>
......@@ -263,7 +263,7 @@ when the translator was updated.
\hline
Catalan & Albert Mora & {\tt\tiny amora@iua.upf.es} & 1.2.17 \\
\hline
Chinese & Li Daobing & {\tt\tiny lidaobing@gmail.com} & 1.3.08 \\
Chinese & Li Daobing & {\tt\tiny lidaobing@gmail.com} & up-to-date \\
~ & Wei Liu & {\tt\tiny liuwei@asiainfo.com} & ~ \\
\hline
Chinese Traditional & Daniel YC Lin & {\tt\tiny daniel@twpda.com} & 1.3.8 \\
......@@ -283,7 +283,7 @@ when the translator was updated.
\hline
French & Xavier Outhier & {\tt\tiny xouthier@yahoo.fr} & 1.3.8 \\
\hline
German & Jens Seidel & {\tt\tiny jensseidel@users.sf.net} & 1.3.8 \\
German & Jens Seidel & {\tt\tiny jensseidel@users.sf.net} & up-to-date \\
\hline
Greek & Harry Kalogirou & {\tt\tiny harkal@rainbow.cs.unipi.gr} & 1.2.11 \\
\hline
......@@ -326,7 +326,7 @@ when the translator was updated.
\hline
Spanish & Francisco Oltra Thennet & {\tt\tiny foltra@puc.cl} & 1.3.8 \\
\hline
Swedish & Mikael Hallin & {\tt\tiny mikaelhallin@yahoo.se} & 1.3.3 \\
Swedish & Mikael Hallin & {\tt\tiny mikaelhallin@yahoo.se} & 1.3.8 \\
\hline
Ukrainian & Olexij Tkatchenko & {\tt\tiny olexij.tkatchenko@gmx.de} & 1.2.11 \\
\hline
......
......@@ -790,16 +790,18 @@ png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#endif
#if defined(PNG_READ_sRGB_SUPPORTED)
#undef png_abs
#define png_abs(x) (((x)>0)?(x):-(x))
if (info_ptr->valid & PNG_INFO_sRGB)
{
if (abs(int_x_white - 31270L) > 1000 ||
abs(int_y_white - 32900L) > 1000 ||
abs(int_x_red - 64000L) > 1000 ||
abs(int_y_red - 33000L) > 1000 ||
abs(int_x_green - 30000L) > 1000 ||
abs(int_y_green - 60000L) > 1000 ||
abs(int_x_blue - 15000L) > 1000 ||
abs(int_y_blue - 6000L) > 1000)
if (png_abs(int_x_white - 31270L) > 1000 ||
png_abs(int_y_white - 32900L) > 1000 ||
png_abs(int_x_red - 64000L) > 1000 ||
png_abs(int_y_red - 33000L) > 1000 ||
png_abs(int_x_green - 30000L) > 1000 ||
png_abs(int_y_green - 60000L) > 1000 ||
png_abs(int_x_blue - 15000L) > 1000 ||
png_abs(int_y_blue - 6000L) > 1000)
{
png_warning(png_ptr,
......@@ -925,15 +927,17 @@ png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
#ifdef PNG_READ_cHRM_SUPPORTED
#ifdef PNG_FIXED_POINT_SUPPORTED
#undef png_abs
#define png_abs(x) (((x)>0)?(x):-(x))
if (info_ptr->valid & PNG_INFO_cHRM)
if (abs(info_ptr->int_x_white - 31270L) > 1000 ||
abs(info_ptr->int_y_white - 32900L) > 1000 ||
abs(info_ptr->int_x_red - 64000L) > 1000 ||
abs(info_ptr->int_y_red - 33000L) > 1000 ||
abs(info_ptr->int_x_green - 30000L) > 1000 ||
abs(info_ptr->int_y_green - 60000L) > 1000 ||
abs(info_ptr->int_x_blue - 15000L) > 1000 ||
abs(info_ptr->int_y_blue - 6000L) > 1000)
if (png_abs(info_ptr->int_x_white - 31270L) > 1000 ||
png_abs(info_ptr->int_y_white - 32900L) > 1000 ||
png_abs(info_ptr->int_x_red - 64000L) > 1000 ||
png_abs(info_ptr->int_y_red - 33000L) > 1000 ||
png_abs(info_ptr->int_x_green - 30000L) > 1000 ||
png_abs(info_ptr->int_y_green - 60000L) > 1000 ||
png_abs(info_ptr->int_x_blue - 15000L) > 1000 ||
png_abs(info_ptr->int_y_blue - 6000L) > 1000)
{
png_warning(png_ptr,
"Ignoring incorrect cHRM value when sRGB is also present");
......
Summary: A documentation system for C/C++.
Name: doxygen
Version: 1.3.8
Version: 1.3.8_20040803
Release: 1
Epoch: 1
Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
......
......@@ -132,6 +132,8 @@
#define _OS_CYGWIN_
#elif defined(__BEOS__)
#define _OS_BEOS_
#elif defined(__MINT__)
#define _OS_MINT_
#else
#error "Qt has not been ported to this OS - talk to qt-bugs@trolltech.com"
#endif
......
......@@ -119,6 +119,8 @@
<xsd:element name="definition" minOccurs="0" />
<xsd:element name="argsstring" minOccurs="0" />
<xsd:element name="name" />
<xsd:element name="read" minOccurs="0" />
<xsd:element name="write" minOccurs="0" />
<xsd:element name="reimplements" type="reimplementType" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="reimplementedby" type="reimplementType" minOccurs="0" maxOccurs="unbounded" />
<xsd:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded" />
......
......@@ -119,6 +119,8 @@
" <xsd:element name=\"definition\" minOccurs=\"0\" />\n"
" <xsd:element name=\"argsstring\" minOccurs=\"0\" />\n"
" <xsd:element name=\"name\" />\n"
" <xsd:element name=\"read\" minOccurs=\"0\" />\n"
" <xsd:element name=\"write\" minOccurs=\"0\" />\n"
" <xsd:element name=\"reimplements\" type=\"reimplementType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
" <xsd:element name=\"reimplementedby\" type=\"reimplementType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
" <xsd:element name=\"param\" type=\"paramType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
......
......@@ -667,6 +667,48 @@ static void handleInitialStyleCommands(DocPara *parent,QList<DocNode> &children)
}
}
static int handleAHref(DocNode *parent,QList<DocNode> &children,const HtmlAttribList &tagHtmlAttribs)
{
HtmlAttribListIterator li(tagHtmlAttribs);
HtmlAttrib *opt;
int index=0;
int retval = RetVal_OK;
for (li.toFirst();(opt=li.current());++li,++index)
{
if (opt->name=="name") // <a name=label> tag
{
if (!opt->value.isEmpty())
{
DocAnchor *anc = new DocAnchor(parent,opt->value,TRUE);
children.append(anc);
break; // stop looking for other tag attribs
}
else
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found <a> tag with name option but without value!");
}
}
else if (opt->name=="href") // <a href=url>..</a> tag
{
// copy attributes
HtmlAttribList attrList = tagHtmlAttribs;
// and remove the href attribute
bool result = attrList.remove(index);
ASSERT(result);
DocHRef *href = new DocHRef(parent,attrList,opt->value);
children.append(href);
g_insideHtmlLink=TRUE;
retval = href->parse();
g_insideHtmlLink=FALSE;
break;
}
else // unsupported option for tag a
{
}
}
return retval;
}
const char *DocStyleChange::styleString() const
{
switch (m_style)
......@@ -1924,6 +1966,11 @@ endlink:
//---------------------------------------------------------------------------
DocDotFile::DocDotFile(DocNode *parent,const QString &name) :
m_parent(parent), m_name(name), m_relPath(g_relPath)
{
}
void DocDotFile::parse()
{
g_nodeStack.push(this);
......@@ -2001,6 +2048,12 @@ void DocDotFile::parse()
//---------------------------------------------------------------------------
DocImage::DocImage(DocNode *parent,const HtmlAttribList &attribs,const QString &name,Type t) :
m_parent(parent), m_attribs(attribs), m_name(name),
m_type(t), m_relPath(g_relPath)
{
}
void DocImage::parse()
{
g_nodeStack.push(this);
......@@ -2134,11 +2187,24 @@ int DocHtmlHeader::parse()
}
goto endheader;
}
else if (tagId==HTML_A)
{
if (!g_token->endTag)
{
handleAHref(this,m_children,g_token->attribs);
}
}
else if (tagId==HTML_BR)
{
DocLineBreak *lb = new DocLineBreak(this);
m_children.append(lb);
}
else
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected html tag <%s%s> found within <h%d> context",
g_token->endTag?"/":"",g_token->name.data(),m_level);
}
}
break;
case TK_SYMBOL:
......@@ -4042,44 +4108,7 @@ int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tag
}
break;
case HTML_A:
{
HtmlAttribListIterator li(tagHtmlAttribs);
HtmlAttrib *opt;
int index=0;
for (li.toFirst();(opt=li.current());++li,++index)
{
if (opt->name=="name") // <a name=label> tag
{
if (!opt->value.isEmpty())
{
DocAnchor *anc = new DocAnchor(this,opt->value,TRUE);
m_children.append(anc);
break; // stop looking for other tag attribs
}
else
{
warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found <a> tag with name option but without value!");
}
}
else if (opt->name=="href") // <a href=url>..</a> tag
{
// copy attributes
HtmlAttribList attrList = tagHtmlAttribs;
// and remove the href attribute
bool result = attrList.remove(index);
ASSERT(result);
DocHRef *href = new DocHRef(this,attrList,opt->value);
m_children.append(href);
g_insideHtmlLink=TRUE;
retval = href->parse();
g_insideHtmlLink=FALSE;
break;
}
else // unsupported option for tag a
{
}
}
}
retval=handleAHref(this,m_children,tagHtmlAttribs);
break;
case HTML_H1:
retval=handleHtmlHeader(tagHtmlAttribs,1);
......@@ -4273,6 +4302,7 @@ int DocPara::handleHtmlEndTag(const QString &tagName)
break;
default:
// we should not get here!
warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected end tag %s\n",tagName.data());
ASSERT(0);
break;
}
......
......@@ -568,8 +568,7 @@ class DocImage : public CompAccept<DocImage>, public DocNode
{
public:
enum Type { Html, Latex, Rtf };
DocImage(DocNode *parent,const HtmlAttribList &attribs,const QString &name,Type t) :
m_parent(parent), m_attribs(attribs), m_name(name), m_type(t) {}
DocImage(DocNode *parent,const HtmlAttribList &attribs,const QString &name,Type t);
Kind kind() const { return Kind_Image; }
Type type() const { return m_type; }
QString name() const { return m_name; }
......@@ -577,6 +576,7 @@ class DocImage : public CompAccept<DocImage>, public DocNode
bool hasCaption() const { return !m_children.isEmpty(); }
QString width() const { return m_width; }
QString height() const { return m_height; }
QString relPath() const { return m_relPath; }
const HtmlAttribList &attribs() const { return m_attribs; }
void accept(DocVisitor *v) { CompAccept<DocImage>::accept(this,v); }
void parse();
......@@ -588,18 +588,19 @@ class DocImage : public CompAccept<DocImage>, public DocNode
Type m_type;
QString m_width;
QString m_height;
QString m_relPath;
};
/*! @brief Node representing a dot file */
class DocDotFile : public CompAccept<DocDotFile>, public DocNode
{
public:
DocDotFile(DocNode *parent,const QString &name) :
m_parent(parent), m_name(name) { }
DocDotFile(DocNode *parent,const QString &name);
void parse();
Kind kind() const { return Kind_DotFile; }
QString name() const { return m_name; }
QString file() const { return m_file; }
QString relPath() const { return m_relPath; }
bool hasCaption() const { return !m_children.isEmpty(); }
QString width() const { return m_width; }
QString height() const { return m_height; }
......@@ -609,6 +610,7 @@ class DocDotFile : public CompAccept<DocDotFile>, public DocNode
DocNode *m_parent;
QString m_name;
QString m_file;
QString m_relPath;
QString m_width;
QString m_height;
};
......
......@@ -1081,8 +1081,9 @@ static void findUsingDirectives(Entry *root)
{
//printf("Found using directive %s at line %d of %s\n",
// root->name.data(),root->startLine,root->fileName.data());
QCString name=substitute(root->name,".","::");
bool ambig;
if (!root->name.isEmpty())
if (!name.isEmpty())
{
NamespaceDef *usingNd = 0;
NamespaceDef *nd = 0;
......@@ -1109,8 +1110,8 @@ static void findUsingDirectives(Entry *root)
{
QCString scope=scopeOffset>0 ?
nsName.left(scopeOffset)+"::" : QCString();
usingNd = getResolvedNamespace(scope+root->name);
//printf("Trying with scope=`%s' usingNd=%p\n",(scope+root->name).data(),usingNd);
usingNd = getResolvedNamespace(scope+name);
//printf("Trying with scope=`%s' usingNd=%p\n",(scope+name).data(),usingNd);
if (scopeOffset==0)
{
scopeOffset=-1;
......@@ -1121,7 +1122,7 @@ static void findUsingDirectives(Entry *root)
}
} while (scopeOffset>=0 && usingNd==0);
//printf("%s -> %p\n",root->name.data(),usingNd);
//printf("%s -> %p\n",name.data(),usingNd);
// add the namespace the correct scope
if (usingNd)
......@@ -1141,7 +1142,7 @@ static void findUsingDirectives(Entry *root)
else // unknown namespace, but add it anyway.
{
NamespaceDef *nd=new NamespaceDef(
root->fileName,root->startLine,root->name);
root->fileName,root->startLine,name);
nd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
nd->addSectionsToDefinition(root->anchors);
......@@ -1169,7 +1170,7 @@ static void findUsingDirectives(Entry *root)
nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
nd->insertUsedFile(root->fileName);
// add class to the list
Doxygen::namespaceSDict.inSort(root->name,nd);
Doxygen::namespaceSDict.inSort(name,nd);
nd->setRefItems(root->sli);
}
}
......@@ -1490,6 +1491,8 @@ static MemberDef *addVariableToClass(
md->setMaxInitLines(root->initLines);
md->setMemberGroupId(root->mGrpId);
md->setMemberSpecifiers(root->memSpec);
md->setReadAccessor(root->read);
md->setWriteAccessor(root->write);
md->enableCallGraph(root->callGraph);
addMemberToGroups(root,md);
//if (root->mGrpId!=-1)
......@@ -2928,18 +2931,18 @@ static QDict<int> *getTemplateArgumentsInName(ArgumentList *templateArguments,co
return templateNames;
}
/*! Searches a class from within the context of \a cd and returns its
/*! Searches a class from within \a context and \a cd and returns its
* definition if found (otherwise 0 is returned).
* This function differs from getResolvedClass in that it also takes
* using declarations and definition into account.
*/
static ClassDef *findClassWithinClassContext(ClassDef *cd,const QCString &name)
static ClassDef *findClassWithinClassContext(Definition *context,ClassDef *cd,const QCString &name)
{
#if 0
ClassDef *result=0;
FileDef *fd=cd->getFileDef();
// try using of namespaces in namespace scope
NamespaceDef *nd=cd->getNamespaceDef();
FileDef *fd=cd->getFileDef();
if (nd) // class is inside a namespace
{
QCString fName = nd->name()+"::"+name;
......@@ -3029,8 +3032,21 @@ static ClassDef *findClassWithinClassContext(ClassDef *cd,const QCString &name)
}
}
}
#endif
return getResolvedClass(cd,fd,name);
FileDef *fd=cd->getFileDef();
ClassDef *result=0;
if (context)
{
result = getResolvedClass(context,0,name);
//printf("** Trying to find %s within context %s result=%s\n",
// name.data(),context->name().data(),result ? result->name().data() : "<none>");
}
if (result==0)
{
result = getResolvedClass(cd,fd,name);
}
return result;
}
enum FindBaseClassRelation_Mode
......@@ -3042,6 +3058,7 @@ enum FindBaseClassRelation_Mode
static bool findClassRelation(
Entry *root,
Definition *context,
ClassDef *cd,
BaseInfo *bi,
QDict<int> *templateNames,
......@@ -3052,6 +3069,7 @@ static bool findClassRelation(
static void findUsedClassesForClass(Entry *root,
Definition *context,
ClassDef *masterCd,
ClassDef *instanceCd,
bool isArtificial,
......@@ -3072,6 +3090,7 @@ static void findUsedClassesForClass(Entry *root,
MemberDef *md=mi->memberDef;
if (md->isVariable()) // for each member variable in this class
{
//printf("Found variable %s in class %s\n",md->name().data(),masterCd->name().data());
QCString type=removeRedundantWhiteSpace(md->typeString());
int pos=0;
QCString usedClassName;
......@@ -3082,10 +3101,10 @@ static void findUsedClassesForClass(Entry *root,
{
type = substituteTemplateArgumentsInString(type,formalArgs,actualArgs);
}
//printf("findUsedClassesForClass(%s)=%s\n",masterCd->name().data(),type.data());
//printf(" template substitution gives=%s\n",type.data());
while (!found && extractClassNameFromType(type,pos,usedClassName,templSpec))
{
//printf("Found used class %s\n",usedClassName.data());
//printf(" found used class %s\n",usedClassName.data());
// the name could be a type definition, resolve it
QCString typeName = resolveTypeDef(masterCd,usedClassName);
//printf("*** Found resolved class %s for %s\n",typeName.data(),usedClassName.data());
......@@ -3105,8 +3124,8 @@ static void findUsedClassesForClass(Entry *root,
replaceNamespaceAliases(usedClassName,si);
}
// add any template arguments to the class
QCString usedName = usedClassName+templSpec;
//printf("usedName=%s\n",usedName.data());
QCString usedName = removeRedundantWhiteSpace(usedClassName+templSpec);
//printf(" usedName=%s\n",usedName.data());
bool delTempNames=FALSE;
if (templateNames==0)
......@@ -3115,7 +3134,7 @@ static void findUsedClassesForClass(Entry *root,
delTempNames=TRUE;
}
BaseInfo bi(usedName,Public,Normal);
findClassRelation(root,instanceCd,&bi,templateNames,TemplateInstances,isArtificial);
findClassRelation(root,context,instanceCd,&bi,templateNames,TemplateInstances,isArtificial);
if (masterCd->templateArguments())
{
......@@ -3150,8 +3169,9 @@ static void findUsedClassesForClass(Entry *root,
if (!found)
{
ClassDef *usedCd=findClassWithinClassContext(masterCd,usedName);
//printf("Looking for used class: result=%p master=%p\n",usedCd,masterCd);
ClassDef *usedCd=findClassWithinClassContext(context,masterCd,usedName);
//printf("Looking for used class %s: result=%s master=%s\n",
// usedName.data(),usedCd?usedCd->name().data():"<none>",masterCd?masterCd->name().data():"<none>");
if (usedCd)
{
......@@ -3197,6 +3217,7 @@ static void findUsedClassesForClass(Entry *root,
static void findBaseClassesForClass(
Entry *root,
Definition *context,
ClassDef *masterCd,
ClassDef *instanceCd,
FindBaseClassRelation_Mode mode,
......@@ -3235,18 +3256,18 @@ static void findBaseClassesForClass(
if (mode==DocumentedOnly)
{
// find a documented base class in the correct scope
if (!findClassRelation(root,instanceCd,&tbi,templateNames,DocumentedOnly,isArtificial))
if (!findClassRelation(root,context,instanceCd,&tbi,templateNames,DocumentedOnly,isArtificial))
{
if (!Config_getBool("HIDE_UNDOC_RELATIONS"))
{
// no documented base class -> try to find an undocumented one
findClassRelation(root,instanceCd,&tbi,templateNames,Undocumented,isArtificial);
findClassRelation(root,context,instanceCd,&tbi,templateNames,Undocumented,isArtificial);
}
}
}
else if (mode==TemplateInstances)
{
findClassRelation(root,instanceCd,&tbi,templateNames,TemplateInstances,isArtificial);
findClassRelation(root,context,instanceCd,&tbi,templateNames,TemplateInstances,isArtificial);
}
if (delTempNames)
{
......@@ -3260,6 +3281,7 @@ static void findBaseClassesForClass(
//----------------------------------------------------------------------
static bool findTemplateInstanceRelation(Entry *root,
Definition *context,
ClassDef *templateClass,const QCString &templSpec,
QDict<int> *templateNames,
bool isArtificial)
......@@ -3302,10 +3324,10 @@ static bool findTemplateInstanceRelation(Entry *root,
Debug::print(Debug::Classes,0," template root found %s!\n",templateRoot->name.data());
ArgumentList *templArgs = new ArgumentList;
stringToArgumentList(templSpec,templArgs);
findBaseClassesForClass(templateRoot,templateClass,instanceClass,
findBaseClassesForClass(templateRoot,context,templateClass,instanceClass,
TemplateInstances,isArtificial,templArgs,templateNames);
findUsedClassesForClass(templateRoot,templateClass,instanceClass,
findUsedClassesForClass(templateRoot,context,templateClass,instanceClass,
isArtificial,templArgs,templateNames);
delete templArgs;
}
......@@ -3339,6 +3361,7 @@ static bool isRecursiveBaseClass(const QCString &scope,const QCString &name)
static bool findClassRelation(
Entry *root,
Definition *context,
ClassDef *cd,
BaseInfo *bi,
QDict<int> *templateNames,
......@@ -3416,10 +3439,10 @@ static bool findClassRelation(
(bi->virt==Normal)?"normal":"virtual"
);
int i;
int si=baseClassName.findRev("::");
int i=baseClassName.find('<');
int si=baseClassName.findRev("::",i==-1 ? baseClassName.length() : i);
if (si==-1) si=0;
if (baseClass==0 && (i=baseClassName.find('<',si))!=-1)
if (baseClass==0 && i!=-1)
// base class has template specifiers
{
// TODO: here we should try to find the correct template specialization
......@@ -3467,7 +3490,7 @@ static bool findClassRelation(
//NamespaceDef *nd=cd->getNamespaceDef();
if (!found)
{
baseClass=findClassWithinClassContext(cd,baseClassName);
baseClass=findClassWithinClassContext(context,cd,baseClassName);
//printf("findClassWithinClassContext(%s,%s)=%p\n",
// cd->name().data(),baseClassName.data(),baseClass);
found = baseClass!=0 && baseClass!=cd;
......@@ -3490,7 +3513,7 @@ static bool findClassRelation(
// relations.
if (!templSpec.isEmpty() && mode==TemplateInstances)
{
findTemplateInstanceRelation(root,baseClass,templSpec,templateNames,isArtificial);
findTemplateInstanceRelation(root,context,baseClass,templSpec,templateNames,isArtificial);
}
else if (mode==DocumentedOnly)
{
......@@ -3643,7 +3666,7 @@ static void findInheritedTemplateInstances()
if ((cd=getClass(bName)))
{
//printf("Class %s %d\n",cd->name().data(),root->extends->count());
findBaseClassesForClass(root,cd,cd,TemplateInstances,FALSE);
findBaseClassesForClass(root,cd,cd,cd,TemplateInstances,FALSE);
}
}
}
......@@ -3663,7 +3686,7 @@ static void findUsedTemplateInstances()
Debug::print(Debug::Classes,0," Class %s : \n",bName.data());
if ((cd=getClass(bName)))
{
findUsedClassesForClass(root,cd,cd,TRUE);
findUsedClassesForClass(root,cd,cd,cd,TRUE);
}
}
}
......@@ -3683,7 +3706,7 @@ static void computeClassRelations()
Debug::print(Debug::Classes,0," Class %s : \n",bName.data());
if ((cd=getClass(bName)))
{
findBaseClassesForClass(root,cd,cd,DocumentedOnly,FALSE);
findBaseClassesForClass(root,cd,cd,cd,DocumentedOnly,FALSE);
}
if ((cd==0 || (!cd->hasDocumentation() && !cd->isReference())) &&
bName.right(2)!="::")
......@@ -3762,10 +3785,10 @@ static void computeTemplateClassRelations()
tbi.name = substituteTemplateArgumentsInString(bi->name,tl,templArgs);
// find a documented base class in the correct scope
if (!findClassRelation(root,tcd,&tbi,actualTemplateNames,DocumentedOnly,FALSE))
if (!findClassRelation(root,cd,tcd,&tbi,actualTemplateNames,DocumentedOnly,FALSE))
{
// no documented base class -> try to find an undocumented one
findClassRelation(root,tcd,&tbi,actualTemplateNames,Undocumented,FALSE);
findClassRelation(root,cd,tcd,&tbi,actualTemplateNames,Undocumented,FALSE);
}
delete actualTemplateNames;
}
......@@ -6194,14 +6217,15 @@ static void findSectionsInDocumentation()
static void flushCachedTemplateRelations()
{
// remove all references to template classes from the cache
// as there can be new template instances that should be linked
// to instead.
// remove all references to classes from the cache
// as there can be new template instances in the inheritance path
// to this class. Optimization: only remove those classes that
// have inheritance instances as direct or indirect sub classes.
QCacheIterator<LookupInfo> ci(Doxygen::lookupCache);
LookupInfo *li=0;
for (ci.toFirst();(li=ci.current());++ci)
{
if (li->classDef && li->classDef->isTemplate())
if (li->classDef)
{
Doxygen::lookupCache.remove(ci.currentKey());
}
......@@ -8244,6 +8268,7 @@ void parseInput()
msg("Building file list...\n");
buildFileList(root);
//generateFileTree();
msg("Searching for included using directives...\n");
findIncludedUsingDirectives();
......
......@@ -70,6 +70,8 @@ Entry::Entry(const Entry &e)
docFile = e.docFile.copy();
relates = e.relates.copy();
relatesDup = e.relatesDup;
read = e.read.copy();
write = e.write.copy();
brief = e.brief.copy();
briefLine = e.briefLine;
briefFile = e.briefFile.copy();
......
......@@ -289,6 +289,8 @@ class Entry
QCString inbodyFile; //!< file in which the body doc was found
QCString relates; //!< related class (doc block)
bool relatesDup; //!< keep duplicate doc in original file also
QCString read; //!< property read accessor
QCString write; //!< property write accessor
QCString inside; //!< name of the class in which documents are found
QCString exception; //!< throw specification
int bodyLine; //!< line number of the definition in the source
......
......@@ -240,6 +240,12 @@ void FileDef::writeDocumentation(OutputList &ol)
ol.startTextBlock();
writeDetailedDocumentation(ol);
ol.endTextBlock();
ol.pushGeneratorState();
ol.disable(OutputGenerator::Man);
ol.disable(OutputGenerator::RTF);
ol.newParagraph();
ol.popGeneratorState();
}
else if (!briefDescription().isEmpty())
{
......@@ -275,11 +281,15 @@ void FileDef::writeDocumentation(OutputList &ol)
fd->name().right(5)==".java";
}
ol.startTypewriter();
if (isIDLorJava)
if (isIDLorJava) // IDL/Java include
{
ol.docify("import ");
}
else
else if (ii->imported) // Objective-C include
{
ol.docify("#import ");
}
else // C/C++ include
{
ol.docify("#include ");
}
......@@ -303,11 +313,12 @@ void FileDef::writeDocumentation(OutputList &ol)
if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !fd->isReference())
{
const char *locStr = (ii->local || isIDLorJava) ? "yes" : "no";
const char *impStr = (ii->imported || isIDLorJava) ? "yes" : "no";
Doxygen::tagFile << " <includes id=\""
<< convertToXML(fd->getOutputFileBase())
<< "\" name=\""
<< convertToXML(fd->name())
<< "\" local=\"" << locStr << "\">"
<< convertToXML(fd->getOutputFileBase()) << "\" "
<< "name=\"" << convertToXML(fd->name()) << "\" "
<< "local=\"" << locStr << "\" "
<< "imported=\"" << impStr << "\">"
<< convertToXML(ii->includeName)
<< "</includes>"
<< endl;
......@@ -543,66 +554,30 @@ void FileDef::insertMember(MemberDef *md)
{
case MemberDef::Variable:
case MemberDef::Property:
if (sortBriefDocs)
decVarMembers.inSort(md);
else
decVarMembers.append(md);
if (sortMemberDocs)
docVarMembers.inSort(md);
else
docVarMembers.append(md);
if (sortBriefDocs) decVarMembers.inSort(md); else decVarMembers.append(md);
if (sortMemberDocs) docVarMembers.inSort(md); else docVarMembers.append(md);
break;
case MemberDef::Function:
if (sortBriefDocs)
decFuncMembers.inSort(md);
else
decFuncMembers.append(md);
if (sortMemberDocs)
docFuncMembers.inSort(md);
else
docFuncMembers.append(md);
if (sortBriefDocs) decFuncMembers.inSort(md); else decFuncMembers.append(md);
if (sortMemberDocs) docFuncMembers.inSort(md); else docFuncMembers.append(md);
break;
case MemberDef::Typedef:
if (sortBriefDocs)
decTypedefMembers.inSort(md);
else
decTypedefMembers.append(md);
if (sortMemberDocs)
docTypedefMembers.inSort(md);
else
docTypedefMembers.append(md);
if (sortBriefDocs) decTypedefMembers.inSort(md); else decTypedefMembers.append(md);
if (sortMemberDocs) docTypedefMembers.inSort(md); else docTypedefMembers.append(md);
break;
case MemberDef::Enumeration:
if (sortBriefDocs)
decEnumMembers.inSort(md);
else
decEnumMembers.append(md);
if (sortMemberDocs)
docEnumMembers.inSort(md);
else
docEnumMembers.append(md);
if (sortBriefDocs) decEnumMembers.inSort(md); else decEnumMembers.append(md);
if (sortMemberDocs) docEnumMembers.inSort(md); else docEnumMembers.append(md);
break;
case MemberDef::EnumValue: // enum values are shown inside their enums
break;
case MemberDef::Prototype:
if (sortBriefDocs)
decProtoMembers.inSort(md);
else
decProtoMembers.append(md);
if (sortMemberDocs)
docProtoMembers.inSort(md);
else
docProtoMembers.append(md);
if (sortBriefDocs) decProtoMembers.inSort(md); else decProtoMembers.append(md);
if (sortMemberDocs) docProtoMembers.inSort(md); else docProtoMembers.append(md);
break;
case MemberDef::Define:
if (sortBriefDocs)
decDefineMembers.inSort(md);
else
decDefineMembers.append(md);
if (sortMemberDocs)
docDefineMembers.inSort(md);
else
docDefineMembers.append(md);
if (sortBriefDocs) decDefineMembers.inSort(md); else decDefineMembers.append(md);
if (sortMemberDocs) docDefineMembers.inSort(md); else docDefineMembers.append(md);
break;
default:
err("FileDef::insertMembers(): "
......@@ -693,7 +668,8 @@ void FileDef::addUsingDeclaration(Definition *d)
}
}
void FileDef::addIncludeDependency(FileDef *fd,const char *incName,bool local)
void FileDef::addIncludeDependency(FileDef *fd,const char *incName,bool local,
bool imported)
{
//printf("FileDef::addIncludeDependency(%p,%s,%d)\n",fd,incName,local);
QCString iName = fd ? fd->absFilePath().data() : incName;
......@@ -703,6 +679,7 @@ void FileDef::addIncludeDependency(FileDef *fd,const char *incName,bool local)
ii->fileDef = fd;
ii->includeName = incName;
ii->local = local;
ii->imported = imported;
includeList->append(ii);
includeDict->insert(iName,ii);
}
......@@ -759,7 +736,8 @@ void FileDef::addIncludedUsingDirectives()
}
void FileDef::addIncludedByDependency(FileDef *fd,const char *incName,bool local)
void FileDef::addIncludedByDependency(FileDef *fd,const char *incName,
bool local,bool imported)
{
//printf("FileDef::addIncludedByDependency(%p,%s,%d)\n",fd,incName,local);
QCString iName = fd ? fd->absFilePath().data() : incName;
......@@ -769,6 +747,7 @@ void FileDef::addIncludedByDependency(FileDef *fd,const char *incName,bool local
ii->fileDef = fd;
ii->includeName = incName;
ii->local = local;
ii->imported = imported;
includedByList->append(ii);
includedByDict->insert(iName,ii);
}
......@@ -970,7 +949,7 @@ static void generateIndent(QTextStream &t,DirEntry *de,int level)
}
}
#if 0
static void writeDirTreeNode(QTextStream &t,Directory *root,int level)
{
QCString indent;
......@@ -1001,12 +980,43 @@ static void writeDirTreeNode(QTextStream &t,Directory *root,int level)
}
}
}
#endif
static void addDirsAsGroups(Directory *root,GroupDef *parent,int level)
{
GroupDef *gd=0;
if (root->kind()==DirEntry::Dir)
{
gd = new GroupDef("<generated>",
1,
root->name(), // name
root->name() // title
);
if (parent)
{
parent->addGroup(gd);
}
else
{
Doxygen::groupSDict.append(root->name(),gd);
}
}
QListIterator<DirEntry> dli(root->children());
DirEntry *de;
for (dli.toFirst();(de=dli.current());++dli)
{
if (de->kind()==DirEntry::Dir)
{
addDirsAsGroups((Directory *)de,gd,level+1);
}
}
}
void generateFileTree(QTextStream &t)
void generateFileTree()
{
FTVHelp::generateTreeViewImages();
Directory *root=new Directory(0,"");
Directory *root=new Directory(0,"root");
root->setLast(TRUE);
FileNameListIterator fnli(Doxygen::inputNameList);
FileName *fn;
......@@ -1019,12 +1029,15 @@ void generateFileTree(QTextStream &t)
mergeFileDef(root,fd);
}
}
t << "<div class=\"directory\">\n";
writeDirTreeNode(t,root,0);
t << "</div>\n";
//t << "<div class=\"directory\">\n";
//writeDirTreeNode(t,root,0);
//t << "</div>\n";
addDirsAsGroups(root,0,0);
delete root;
}
//-------------------------------------------------------------------
void FileDef::combineUsingRelations()
{
if (visited) return; // already done
......
......@@ -46,6 +46,7 @@ struct IncludeInfo
FileDef *fileDef;
QCString includeName;
bool local;
bool imported;
};
/*! \class FileDef filedef.h
......@@ -140,8 +141,8 @@ class FileDef : public Definition
bool generateSourceFile() const;
void addIncludeDependency(FileDef *fd,const char *incName,bool local);
void addIncludedByDependency(FileDef *fd,const char *incName,bool local);
void addIncludeDependency(FileDef *fd,const char *incName,bool local,bool imported);
void addIncludedByDependency(FileDef *fd,const char *incName,bool local,bool imported);
QList<IncludeInfo> *includeFileList() const { return includeList; }
QList<IncludeInfo> *includedByFileList() const { return includedByList; }
......@@ -286,7 +287,8 @@ class Directory : public DirEntry
QList<DirEntry> m_children;
};
void generateFileTree(QTextStream &t);
//void generateFileTree(QTextStream &t);
void generateFileTree();
#endif
......@@ -709,7 +709,7 @@ void HtmlDocVisitor::visitPre(DocImage *img)
baseName=baseName.right(baseName.length()-i-1);
}
m_t << "<div align=\"center\">" << endl;
m_t << "<img src=\"" << img->name() << "\" alt=\""
m_t << "<img src=\"" << img->relPath() << img->name() << "\" alt=\""
<< baseName << "\"" << htmlAttribsToString(img->attribs()) << ">" << endl;
if (img->hasCaption())
{
......@@ -743,7 +743,7 @@ void HtmlDocVisitor::visitPost(DocImage *img)
void HtmlDocVisitor::visitPre(DocDotFile *df)
{
if (m_hide) return;
writeDotFile(df->file(),"");
writeDotFile(df->file(),df->relPath());
m_t << "<div align=\"center\">" << endl;
if (df->hasCaption())
{
......
......@@ -309,6 +309,12 @@ void HtmlGenerator::writeStyleSheetFile(QFile &file)
static void writeDefaultHeaderFile(QTextStream &t, const char *title,
const char *relPath,bool usePathCmd)
{
QString relPathStr;
if (usePathCmd)
relPathStr="$relpath$";
else
relPathStr=relPath;
t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"
"<html><head>"
"<meta http-equiv=\"Content-Type\" content=\"text/html;charset="
......@@ -320,11 +326,7 @@ static void writeDefaultHeaderFile(QTextStream &t, const char *title,
t << "href=\"";
if (Config_getString("HTML_STYLESHEET").isEmpty())
{
if (usePathCmd)
t << "$relpath$";
else
t << relPath;
t << "doxygen.css";
t << relPathStr << "doxygen.css";
}
else
{
......@@ -334,7 +336,7 @@ static void writeDefaultHeaderFile(QTextStream &t, const char *title,
{
err("Error: user specified HTML style sheet file does not exist!\n");
}
t << cssfi.fileName();
t << relPathStr << cssfi.fileName();
}
t << "\" rel=\"stylesheet\" type=\"text/css\">\n"
"</head><body>\n";
......
......@@ -93,6 +93,10 @@ class MemberDef : public Definition
NamespaceDef* getNamespaceDef() const { return nspace; }
//Definition *getCompoundDef() const;
// grabbing the property read/write accessor names
const char *getReadAccessor() const { return read; }
const char *getWriteAccessor() const { return write; }
// querying the grouping definition
GroupDef *getGroupDef() const { return group; }
Grouping::GroupPri_t getGroupPri() const { return grouppri; }
......@@ -161,6 +165,8 @@ class MemberDef : public Definition
void setSectionList(Definition *d,MemberList *sl);
void setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs);
void setExplicitExternal(bool b) { explExt=b; }
void setReadAccessor(const char *r) { read=r; }
void setWriteAccessor(const char *w) { write=w; }
void makeRelated() { related=TRUE; }
......@@ -307,6 +313,8 @@ class MemberDef : public Definition
QCString type; // return type
QCString args; // function arguments/variable array specifiers
QCString bitfields; // struct member bitfields
QCString read; // property read accessor
QCString write; // property write accessor
QCString exception; // exceptions that can be thrown
QCString init; // initializer
int initLines; // number of lines in the initializer
......
......@@ -99,6 +99,7 @@ static bool g_macroExpansion; // from the configuration
static bool g_expandOnlyPredef; // from the configuration
static int g_commentCount;
static bool g_insideComment;
static bool g_isImported;
static void setFileName(const char *name)
......@@ -1065,12 +1066,12 @@ static void readIncludeFile(const QCString &inc)
if (oldFileDef)
{
// add include dependency to the file in which the #include was found
oldFileDef->addIncludeDependency(g_yyFileDef,incFileName,localInclude);
oldFileDef->addIncludeDependency(g_yyFileDef,incFileName,localInclude,g_isImported);
// add included by dependency
if (g_yyFileDef)
{
//printf("Adding include dependency %s->%s\n",oldFileDef->name().data(),incFileName.data());
g_yyFileDef->addIncludedByDependency(oldFileDef,oldFileDef->name(),localInclude);
g_yyFileDef->addIncludedByDependency(oldFileDef,oldFileDef->name(),localInclude,g_isImported);
}
}
FileState *fs=new FileState;
......@@ -1100,12 +1101,12 @@ static void readIncludeFile(const QCString &inc)
FileDef *fd = findFileDef(Doxygen::inputNameDict,incFileName,ambig);
//printf("findFileDef(%s)=%p\n",incFileName.data(),fd);
// add include dependency to the file in which the #include was found
oldFileDef->addIncludeDependency(fd,incFileName,localInclude);
oldFileDef->addIncludeDependency(fd,incFileName,localInclude,g_isImported);
// add included by dependency
if (fd)
{
//printf("Adding include dependency (2) %s->%s ambig=%d\n",oldFileDef->name().data(),fd->name().data(),ambig);
fd->addIncludedByDependency(oldFileDef,oldFileDef->name(),localInclude);
fd->addIncludedByDependency(oldFileDef,oldFileDef->name(),localInclude,g_isImported);
}
}
if (Debug::isFlagSet(Debug::Preprocessor))
......@@ -1386,11 +1387,13 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
<ReadString>. {
g_defArgsStr+=*yytext;
}
<Command>"include"{B}+/{ID} {
<Command>("include"|"import"){B}+/{ID} {
g_isImported = yytext[1]=='m';
if (g_macroExpansion)
BEGIN(IncludeID);
}
<Command>"include"{B}*[<"] {
<Command>("include"|"import"){B}*[<"] {
g_isImported = yytext[1]=='m';
char c[2];
c[0]=yytext[yyleng-1];c[1]='\0';
g_incName=c;
......
......@@ -837,7 +837,8 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
%x ObjCProtocolList
%x QtPropType
%x QtPropName
%x QtPropRW
%x QtPropRead
%x QtPropWrite
%%
......@@ -1181,7 +1182,11 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
current->virt = Virtual;
lineCount();
}
<FindMembers>{B}*"abstract"{BN}+ { current->type += " abstract ";
<FindMembers>{B}*"abstract"{BN}+ {
if (!insidePHP)
{
current->type += " abstract ";
}
current->virt = Pure;
lineCount();
}
......@@ -1253,7 +1258,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
}
<FindMembers>{B}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba IDL interface
lineCount();
if (insideIDL || insideJava || insideCS || insideD)
if (insideIDL || insideJava || insideCS || insideD || insidePHP)
{
isTypedef=FALSE;
current->section = Entry::INTERFACE_SEC;
......@@ -1621,15 +1626,20 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
}
<QtPropName>{ID} {
current->name=yytext;
BEGIN(QtPropRW);
BEGIN(QtPropRead);
}
<QtPropRW>"READ" {
<QtPropRead>"READ" {
current->memSpec |= Entry::Readable;
}
<QtPropRW>"WRITE" {
<QtPropRead>{ID} {
current->read = yytext;
BEGIN(QtPropWrite);
}
<QtPropWrite>"WRITE" {
current->memSpec |= Entry::Writable;
}
<QtPropRW>")" {
<QtPropWrite>{ID} {
current->write = yytext;
unput(';');
BEGIN(FindMembers);
}
......@@ -1666,7 +1676,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
{
addType( current ) ;
}
bool javaLike = insideJava || insideCS || insideD;
bool javaLike = insideJava || insideCS || insideD || insidePHP;
if (javaLike && strcmp(yytext,"public")==0)
{
current->protection = Public;
......@@ -2230,27 +2240,17 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
{
current->type = current->type.mid(3);
}
if (!current->name.isEmpty() && current->section!=Entry::ENUM_SEC)
{
current->type=current->type.simplifyWhiteSpace();
current->args=removeRedundantWhiteSpace(current->args);
// was: current->args.simplifyWhiteSpace();
current->name=current->name.stripWhiteSpace();
//if (!current->name.isEmpty() && current->type.left(8)=="typedef ")
//{
// // add typedef to dictionary
// QCString dest = extractName(current->type.right(current->type.length()-8));
// if (Doxygen::typedefDict[current->name]==0 && !dest.isEmpty())
// {
// //printf("1>>>>>>>>>> adding %s->%s\n",current->name.data(),dest.data());
// QCString scope;
// if (current_root->section & Entry::SCOPE_MASK) scope=current_root->name;
// Doxygen::typedefDict.insert(current->name, new TypedefInfo(dest,scope));
// }
//}
current->section = Entry::VARIABLE_SEC ;
current->fileName = yyFileName;
current->startLine = yyLineNr;
//printf("New variable type=`%s' name=`%s' groupId=%d\n",current->type.data(),current->name.data(),current->mGrpId);
current_root->addSubEntry( current ) ;
}
if ( *yytext == ',')
{
current = new Entry(*current);
......@@ -3558,15 +3558,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
roundCount=0;
BEGIN(SkipUnionSwitch);
}
else if (insideJava && (strcmp(yytext,"implements")==0 || strcmp(yytext,"extends")==0))
{
current->type.resize(0);
baseProt=Public;
baseVirt=Normal;
baseName.resize(0);
BEGIN( BasesProt ) ;
}
else if (insidePHP && (strcmp(yytext,"extends")==0))
else if ((insideJava || insidePHP) && (strcmp(yytext,"implements")==0 || strcmp(yytext,"extends")==0))
{
current->type.resize(0);
baseProt=Public;
......@@ -3684,10 +3676,10 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
BEGIN( ReadBody ) ;
}
}
<BasesProt>"virtual" { baseVirt = Virtual; }
<BasesProt>"public" { baseProt = Public; }
<BasesProt>"protected" { baseProt = Protected; }
<BasesProt>"private" { baseProt = Private; }
<BasesProt>"virtual"{BN}+ { lineCount(); baseVirt = Virtual; }
<BasesProt>"public"{BN}+ { lineCount(); baseProt = Public; }
<BasesProt>"protected"{BN}+ { lineCount(); baseProt = Protected; }
<BasesProt>"private"{BN}+ { lineCount(); baseProt = Private; }
<BasesProt>{BN} { lineCount(); }
<BasesProt>. { unput(*yytext); BEGIN(Bases); }
<Bases>("::")?{BN}*({ID}{BN}*"::"{BN}*)*{ID} {
......
......@@ -99,6 +99,7 @@ class TagIncludeInfo
QString name;
QString text;
bool isLocal;
bool isImported;
};
/*! Container for file specific info that can be read from a tagfile */
......@@ -470,6 +471,7 @@ class TagFileParser : public QXmlDefaultHandler
m_curIncludes->id = attrib.value("id");
m_curIncludes->name = attrib.value("name");
m_curIncludes->isLocal = attrib.value("local")=="yes" ? TRUE : FALSE;
m_curIncludes->isImported = attrib.value("imported")=="yes" ? TRUE : FALSE;
m_curFile->includes.append(m_curIncludes);
}
else
......@@ -1215,7 +1217,7 @@ void TagFileParser::addIncludes()
// ifd->getOutputFileBase().data(),ii->id.data());
if (ifd->getOutputFileBase()==QCString(ii->id))
{
fd->addIncludeDependency(ifd,ii->text,ii->isLocal);
fd->addIncludeDependency(ifd,ii->text,ii->isLocal,ii->isImported);
}
}
}
......
......@@ -24,7 +24,7 @@
*/
#define CN_SPC
class TranslatorChinese : public TranslatorAdapter_1_3_3
class TranslatorChinese : public Translator
{
public:
/*! Used for identification of the language. The identification
......@@ -1467,9 +1467,22 @@ class TranslatorChinese : public TranslatorAdapter_1_3_3
*/
virtual QCString trSearchMatches()
{
return "Matches:";
/* return "Matches:"; */
return "符合的结果:";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.3.8
//////////////////////////////////////////////////////////////////////////
/*! This is used in HTML as the title of page with source code for file filename
*/
virtual QCString trSourceFile(QCString& filename)
{
/* return filename + " Source File"; */
return filename + CN_SPC"源文件";
}
};
#endif
......@@ -84,13 +84,16 @@
// - Updated a few strings which changed in CVS revision 1.22
// ("compound" vs. "class")
//
// 2004/08/01 Jens Seidel (jensseidel@users.sourceforge.net)
// - Updated for "new since 1.3.8" version
//
// Todo:
// - see FIXME
#ifndef TRANSLATOR_DE_H
#define TRANSLATOR_DE_H
class TranslatorGerman : public TranslatorAdapter_1_3_8
class TranslatorGerman : public Translator
{
public:
......@@ -156,7 +159,7 @@ class TranslatorGerman : public TranslatorAdapter_1_3_8
/*! this is the text of a link put after brief descriptions. */
virtual QCString trMore()
{ return "Mehr..."; }
{ return "Mehr ..."; }
/*! put in the class documentation */
virtual QCString trListOfAllMembers()
......@@ -1604,6 +1607,18 @@ class TranslatorGerman : public TranslatorAdapter_1_3_8
{
return "Treffer:";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.3.8
//////////////////////////////////////////////////////////////////////////
/*! This is used in HTML as the title of page with source code for file filename
*/
virtual QCString trSourceFile(QCString& filename)
{
return filename + " Quellcode";
}
};
#endif
......@@ -72,7 +72,7 @@
#ifndef TRANSLATOR_DK_H
#define TRANSLATOR_DK_H
class TranslatorDanish : public TranslatorAdapter_1_3_8
class TranslatorDanish : public Translator
{
public:
......@@ -1445,6 +1445,19 @@ class TranslatorDanish : public TranslatorAdapter_1_3_8
return "Fundne ord:"; //translation?
}
//////////////////////////////////////////////////////////////////////////
// new since 1.3.8
//////////////////////////////////////////////////////////////////////////
/*! This is used in HTML as the title of page with source code for
* file filename
*/
virtual QCString trSourceFile(QCString& filename)
{
return "Kildefilen " + filename;
}
/*---------- For internal use: ----------------------------------------*/
protected:
/*! For easy flexible-noun implementation.
......
......@@ -69,7 +69,7 @@ Problem!
#ifndef TRANSLATOR_SE_H
#define TRANSLATOR_SE_H
class TranslatorSwedish : public TranslatorAdapter_1_3_3
class TranslatorSwedish : public TranslatorAdapter_1_3_8
{
public:
......@@ -1350,7 +1350,56 @@ class TranslatorSwedish : public TranslatorAdapter_1_3_3
return "Hr r anropnings diagrammet fr den hr funktionen:";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.3.3
//////////////////////////////////////////////////////////////////////////
/*! When the search engine is enabled this text is put in the header
* of each page before the field where one can enter the text to search
* for.
*/
virtual QCString trSearchForIndex()
{
return "Sk efter";
}
/*! This string is used as the title for the page listing the search
* results.
*/
virtual QCString trSearchResultsTitle()
{
return "Skresultat";
}
/*! This string is put just before listing the search results. The
* text can be different depending on the number of documents found.
* Inside the text you can put the special marker $num to insert
* the number representing the actual number of search results.
* The @a numDocuments parameter can be either 0, 1 or 2, where the
* value 2 represents 2 or more matches. HTML markup is allowed inside
* the returned string.
*/
virtual QCString trSearchResults(int numDocuments)
{
if (numDocuments==0)
{
return "Tyvrr finns det inga dokument som matchar din skning.";
}
else if (numDocuments==1)
{
return "Hittade <b>1</b> dokument som matchar din skning.";
}
else
{
return "Hittade <b>$num</b> dokument som matchar din skning. "
"Visar de bsta trffarna frst.";
}
}
/*! This string is put before the list of matched words, for each search
* result. What follows is the list of words that matched the query.
*/
virtual QCString trSearchMatches()
{
return "Trffar:";
}
};
......
......@@ -1010,7 +1010,6 @@ ClassDef *getResolvedClassRec(Definition *scope,
QCString name=n;
QCString explicitScopePart;
//int qualifierIndex = name.findRev("::"); // todo: deal with cases like A<B::C>
int qualifierIndex = computeQualifiedIndex(name);
//printf("name=%s qualifierIndex=%d\n",name.data(),qualifierIndex);
if (qualifierIndex!=-1) // qualified name
......@@ -1032,7 +1031,6 @@ ClassDef *getResolvedClassRec(Definition *scope,
//printf("Looking for symbol %s result=%p\n",name.data(),dl);
if (dl==0)
{
// name is not a known symbol
return 0;
}
......@@ -1181,7 +1179,7 @@ ClassDef *getResolvedClass(Definition *scope,
}
//printf("getResolvedClass(%s,%s)=%s\n",scope?scope->name().data():"<global>",
// n,result?result->name().data():"<none>");
//
return result;
}
......@@ -4120,14 +4118,22 @@ QCString substituteTemplateArgumentsInString(
++formAli,actArg=actualArgs->next()
)
{
//printf("n=%s formArg->type=%s formArg->name=%s\n",
// n.data(),formArg->type.data(),formArg->name.data());
if (formArg->type=="class" || formArg->type=="typename")
{
//printf("n=%s formArg->type=%s formArg->name=%si formArg->defval=%s\n",
// n.data(),formArg->type.data(),formArg->name.data(),formArg->defval.data());
if (formArg->name==n && actArg && !actArg->type.isEmpty()) // base class is a template argument
{
// replace formal argument with the actual argument of the instance
if (actArg->name.isEmpty())
{
result += actArg->type+" ";
}
else // for case where the actual arg is something like "unsigned int"
// the "int" part is in actArg->name.
{
result += actArg->type+" "+actArg->name+" ";
}
found=TRUE;
}
else if (formArg->name==n && actArg==0 && !formArg->defval.isEmpty() &&
......
......@@ -619,6 +619,15 @@ static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,De
}
t << " <name>" << convertToXML(md->name()) << "</name>" << endl;
if (md->memberType() == MemberDef::Property)
{
if (md->isReadable())
t << " <read>" << convertToXML(md->getReadAccessor()) << "</read>" << endl;
if (md->isWritable())
t << " <write>" << convertToXML(md->getWriteAccessor()) << "</write>" << endl;
}
MemberDef *rmd = md->reimplements();
if (rmd)
{
......
#! Use the common Unix template
#$ IncludeTemplate("../unix/app.t");
#! Use the common Unix template
#$ IncludeTemplate("../unix/lib.t");
#! Use the common Unix template
#$ IncludeTemplate("../unix/subdirs.t");
#
#
#
# tmake configuration for linux-g++
#
TEMPLATE = app
CONFIG = qt warn_on release
TMAKE_CC = gcc
TMAKE_CFLAGS = -pipe
TMAKE_CFLAGS_WARN_ON = -Wall -W -fno-exceptions
TMAKE_CFLAGS_WARN_OFF =
TMAKE_CFLAGS_RELEASE = -O2
TMAKE_CFLAGS_DEBUG = -g
TMAKE_CFLAGS_SHLIB = -fPIC
TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
TMAKE_CXX = g++
TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
TMAKE_INCDIR =
TMAKE_LIBDIR =
TMAKE_INCDIR_X11 = /usr/X11R6/include
TMAKE_LIBDIR_X11 = /usr/X11R6/lib
TMAKE_INCDIR_QT = $(QTDIR)/include
TMAKE_LIBDIR_QT = $(QTDIR)/lib
TMAKE_INCDIR_OPENGL = /usr/X11R6/include
TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
TMAKE_LINK = g++
TMAKE_LINK_SHLIB = g++
TMAKE_LFLAGS =
TMAKE_LFLAGS_RELEASE =
TMAKE_LFLAGS_DEBUG = -g
TMAKE_LFLAGS_SHLIB = -shared
TMAKE_LFLAGS_SONAME = -Wl,-soname,
TMAKE_LIBS =
TMAKE_LIBS_X11 = -lXext -lX11 -lm
TMAKE_LIBS_X11SM = -lICE -lSM
TMAKE_LIBS_QT = -lqt
TMAKE_LIBS_QT_MT = -lqt-mt
TMAKE_LIBS_QT_OPENGL = -lqgl
TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
TMAKE_MOC = moc
TMAKE_AR = ar cqs
TMAKE_RANLIB =
TMAKE_TAR = tar -cf
TMAKE_GZIP = gzip -9f
......@@ -144,6 +144,10 @@ SOURCE=..\qtools\qglobal.cpp
# End Source File
# Begin Source File
SOURCE=..\qtools\qgcache.cpp
# End Source File
# Begin Source File
SOURCE=..\qtools\qgvector.cpp
# End 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