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

Release-1.6.1

parent 2e1a3702
DOXYGEN Version 1.6.0
DOXYGEN Version 1.6.1
Please read the installation section of the manual
(http://www.doxygen.org/install.html) for instructions.
--------
Dimitri van Heesch (20 August 2009)
Dimitri van Heesch (25 August 2009)
......@@ -105,7 +105,6 @@ rpm: dist
mkdir $(DISTDIR)/packages
mkdir $(DISTDIR)/packages/rpm
cp packages/rpm/doxygen.spec $(DISTDIR)/packages/rpm
tar -rvf $(DISTDIR).src.tar $(DISTDIR)/packages/rpm/doxygen.spec
rm -rf $(DISTDIR)
gzip -9v $(DISTDIR).src.tar
rpmbuild -ta %%WITHDOXYWIZARD%% $(DISTDIR).src.tar.gz
......
DOXYGEN Version 1.6.0
DOXYGEN Version 1.6.1
Please read INSTALL for compilation instructions.
......@@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives.
Enjoy,
Dimitri van Heesch (dimitri@stack.nl) (20 August 2009)
Dimitri van Heesch (dimitri@stack.nl) (25 August 2009)
......@@ -568,17 +568,17 @@ void Step3::setHtmlOptions(int id)
if (id==0) // plain HTML
{
updateBoolOption(m_modelData,STR_GENERATE_HTMLHELP,false);
updateStringOption(m_modelData,STR_GENERATE_TREEVIEW,QString::fromAscii("NONE"));
updateBoolOption(m_modelData,STR_GENERATE_TREEVIEW,false);
}
else if (id==1) // with navigation tree
{
updateBoolOption(m_modelData,STR_GENERATE_HTMLHELP,false);
updateStringOption(m_modelData,STR_GENERATE_TREEVIEW,QString::fromAscii("ALL"));
updateBoolOption(m_modelData,STR_GENERATE_TREEVIEW,true);
}
else if (id==2) // with compiled help
{
updateBoolOption(m_modelData,STR_GENERATE_HTMLHELP,true);
updateStringOption(m_modelData,STR_GENERATE_TREEVIEW,QString::fromAscii("NONE"));
updateBoolOption(m_modelData,STR_GENERATE_TREEVIEW,false);
}
}
......
......@@ -17,7 +17,7 @@
doxygen_version_major=1
doxygen_version_minor=6
doxygen_version_revision=0
doxygen_version_revision=1
#NOTE: Setting version_mmn to "NO" will omit mmn info from the package.
doxygen_version_mmn=NO
......
......@@ -1508,16 +1508,16 @@ FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
\addindex GENERATE_TREEVIEW
The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
structure should be generated to display hierarchical information.
If the tag value is set to FRAME, a side panel will be generated
If the tag value is set to YES, a side panel will be generated
containing a tree-like index structure (just like the one that
is generated for HTML Help). For this to work a browser that supports
JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
Windows users are probably better off using the HTML help feature.
JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
Windows users are probably better off using the HTML help feature.
Via custom stylesheets (see \ref cfg_html_stylesheet "HTML_STYLESHEET")
one can further \ref doxygen_finetune "fine tune" the look of the index.
As an example, the default style sheet generated by doxygen has an
example that shows how to put an image at the root of the tree instead of
one can further \ref doxygen_finetune "fine tune" the look of the index.
As an example, the default style sheet generated by doxygen has an
example that shows how to put an image at the root of the tree instead of
the \ref cfg_project_name "project name".
\anchor cfg_use_inline_trees
......
......@@ -9,6 +9,14 @@ all XML comments starting with '*' or '!'. An additional '<' can be
used to assign the documentation string to the previous entity instead
of the one following the comment.
Note that before the parsing of DBus XML file works one has to
assign the .xml extension to the DBus XML parser using the
following configuration option:
\verbatim
EXTENSION_MAPPING = xml=dbusxml
\endverbatim
\section dbusxml_supported Supported XML elements and attributes
<p>The following DBus XML elemets can be annotated:
......
This diff is collapsed.
This diff is collapsed.
......@@ -14,7 +14,7 @@ URL: http://www.stack.nl/~dimitri/doxygen/index.html
Vendor: Dimitri van Heesch
License: GNU General Public License
Group: Development/Tools
Source: %{name}-%{version}_%{revision}.src.tar.gz
Source: %{name}-%{version}.src.tar.gz
BuildRoot: %{buildroot}
BuildPrereq: libstdc++-devel >= 2.96, /usr/bin/perl, /usr/bin/latex, /usr/bin/dvips, /usr/bin/gs
Prereq: /sbin/chkconfig, /bin/mktemp, /bin/rm, /bin/mv, libstdc++ >= 2.96
......@@ -48,7 +48,7 @@ install.
%endif
%prep
%setup -q -n %{name}-%{version}_%{revision}
%setup -q -n %{name}-%{version}
./configure %{?_with_doxywizard} --prefix $RPM_BUILD_ROOT/usr
%build
......
......@@ -1021,7 +1021,7 @@ RCSTAG "$"{ID}":"[^\n$]+"$"
<Comment>^{B}*"."{B}*/\n { // explicit end autolist: e.g " ."
addOutput(yytext);
}
<Comment>"."[a-z_A-Z0-9] { // . at start or in the middle of a word
<Comment>("."+)[a-z_A-Z0-9] { // . at start or in the middle of a word, or ellipsis
addOutput(yytext);
}
<Comment>".\\"[ \t] { // . with escaped space.
......@@ -2626,6 +2626,7 @@ static void groupAddDocs(Entry *e,const char *fileName)
{
info->doc = g_memberGroupDocs;
info->docFile = fileName;
info->setRefItems(e->sli);
}
e->doc.resize(0);
e->brief.resize(0);
......
......@@ -449,6 +449,11 @@ The appearance of the initializer of individual variables and defines in the
documentation can be controlled using \showinitializer or \hideinitializer
command in the documentation regardless of this setting.
' minval='0' maxval='10000' defval='30'/>
<option type='bool' id='SHOW_USED_FILES' docs='
Set the SHOW_USED_FILES tag to NO to disable the list of files generated
at the bottom of the documentation of classes and structs. If set to YES the
list will mention the files that were used to generate the documentation.
' defval='1'/>
<option type='bool' id='SHOW_DIRECTORIES' docs='
If the sources in your project are distributed over multiple directories
then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
......@@ -884,7 +889,7 @@ that doxygen will group on one line in the generated HTML documentation.
<option type='bool' id='GENERATE_TREEVIEW' defval='0' docs='
The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
structure should be generated to display hierarchical information.
If the tag value is set to FRAME, a side panel will be generated
If the tag value is set to YES, a side panel will be generated
containing a tree-like index structure (just like the one that
is generated for HTML Help). For this to work a browser that supports
JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).
......@@ -1374,7 +1379,6 @@ If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
remove the intermediate dot files that are used to generate
the various graphs.
' defval='1' depends='HAVE_DOT'/>
<option type='obsolete' id='SHOW_USED_FILES'/>
<option type='obsolete' id='USE_WINDOWS_ENCODING'/>
<option type='obsolete' id='DETAILS_AT_TOP'/>
<option type='obsolete' id='QTHELP_FILE'/>
......
......@@ -635,6 +635,14 @@ void addConfigOptions(Config *cfg)
0,10000,30
);
//----
cb = cfg->addBool(
"SHOW_USED_FILES",
"Set the SHOW_USED_FILES tag to NO to disable the list of files generated\n"
"at the bottom of the documentation of classes and structs. If set to YES the\n"
"list will mention the files that were used to generate the documentation.",
TRUE
);
//----
cb = cfg->addBool(
"SHOW_DIRECTORIES",
"If the sources in your project are distributed over multiple directories\n"
......@@ -1293,7 +1301,7 @@ void addConfigOptions(Config *cfg)
"GENERATE_TREEVIEW",
"The GENERATE_TREEVIEW tag is used to specify whether a tree-like index\n"
"structure should be generated to display hierarchical information.\n"
"If the tag value is set to FRAME, a side panel will be generated\n"
"If the tag value is set to YES, a side panel will be generated\n"
"containing a tree-like index structure (just like the one that\n"
"is generated for HTML Help). For this to work a browser that supports\n"
"JavaScript, DHTML, CSS and frames is required (i.e. any modern browser).\n"
......@@ -2089,8 +2097,6 @@ void addConfigOptions(Config *cfg)
);
cb->addDependency("HAVE_DOT");
//----
cfg->addObsolete("SHOW_USED_FILES");
//----
cfg->addObsolete("USE_WINDOWS_ENCODING");
//----
cfg->addObsolete("DETAILS_AT_TOP");
......
......@@ -354,6 +354,7 @@ public:
// Interface:
if (DBUS("interface"))
{
CONDITION(m_currentInterface, "end of interface found without start.");
m_currentInterface->endBodyLine = lineNumber();
closeScopes();
m_currentInterface = 0;
......@@ -361,6 +362,8 @@ public:
if (DBUS("method") || DBUS("signal"))
{
CONDITION(m_currentMethod, "end of method found without start.");
CONDITION(m_currentInterface, "end of method found outside interface.");
m_currentMethod->endBodyLine = lineNumber();
m_currentInterface->addSubEntry(m_currentMethod);
m_currentMethod = 0;
......@@ -368,6 +371,8 @@ public:
if (DBUS("property"))
{
CONDITION(m_currentMethod, "end of property found without start.");
CONDITION(m_currentInterface, "end of property found outside interface.");
m_currentProperty->endBodyLine = lineNumber();
m_currentInterface->addSubEntry(m_currentProperty);
m_currentProperty = 0;
......@@ -375,6 +380,7 @@ public:
if (DBUS("arg"))
{
CONDITION(m_currentMethod, "end of arg found outside method.");
m_currentMethod->argList->append(m_currentArgument);
m_currentArgument = 0;
}
......@@ -382,6 +388,7 @@ public:
if (EXTENSION("namespace"))
{
Entry * current = m_namespaceStack.last();
CONDITION(current, "end of namespace without start.");
m_namespaceStack.removeLast();
current->endBodyLine = lineNumber();
......@@ -391,6 +398,7 @@ public:
if (EXTENSION("struct"))
{
StructData * data = m_structStack.last();
CONDITION(data, "end of struct without start.");
data->entry->endBodyLine = lineNumber();
......@@ -408,11 +416,14 @@ public:
if (EXTENSION("member"))
{
m_structStack.last()->entry->addSubEntry(m_currentEntry);
StructData * data = m_structStack.last();
CONDITION(data, "end of struct without start");
data->entry->addSubEntry(m_currentEntry);
}
if (EXTENSION("enum") || EXTENSION("flagset"))
{
CONDITION(m_currentEnum, "end of enum without start");
m_currentEnum->endBodyLine = lineNumber();
closeScopes();
......@@ -421,6 +432,7 @@ public:
if (EXTENSION("value"))
{
CONDITION(m_currentEntry, "end of value without start");
m_currentEntry->endBodyLine = lineNumber();
m_currentEnum->addSubEntry(m_currentEntry);
......@@ -847,7 +859,8 @@ void DBusXMLScanner::parseInput(const char * fileName,
reader.parse(inputSource);
if (handler.errorString())
{ err("ERROR parsing XML: %s\n", handler.errorString().utf8().data()); }
{ err("DBus XML Parser: Error at line %d: %s\n",
handler.locator()->lineNumber(),handler.errorString().utf8().data()); }
groupLeaveFile(fileName, 1);
}
......
......@@ -702,10 +702,12 @@ void DirRelation::writeDocumentation(OutputList &ol)
ol.pushGeneratorState();
ol.disableAllBut(OutputGenerator::Html);
QCString shortTitle=m_src->shortName()+" &rarr; "+
m_dst->dir()->shortName()+" Relation";//theTranslator->trDirRelation(m_shortName);
QCString title=m_src->displayName()+" -> "+
m_dst->dir()->shortName()+" Relation";//theTranslator->trDirRelation(m_dispName);
QCString shortTitle=theTranslator->trDirRelation(
m_src->shortName()+" &rarr; "+
m_dst->dir()->shortName());
QCString title=theTranslator->trDirRelation(
m_src->displayName()+" -> "+
m_dst->dir()->shortName());
startFile(ol,getOutputFileBase(),getOutputFileBase(),title);
// write navigation path
......
......@@ -725,7 +725,7 @@ REFWORD ("#"|"::")?({ID}{TEMPLPART}?("."|"#"|"::"|"-"|"/"))*({ID}(":")?){FUNCA
unput(' ');
return 0;
}
<St_Ref>{WS}+"\"" { // white space following by quoted string
<St_Ref>{WS}+"\""{WS}* { // white space following by quoted string
BEGIN(St_Ref2);
}
<St_Ref>\n { // new line
......
......@@ -6330,6 +6330,7 @@ static void findEnums(EntryNav *rootNav)
md->setMemberGroupId(root->mGrpId);
md->enableCallGraph(root->callGraph);
md->enableCallerGraph(root->callerGraph);
//printf("%s::setRefItems(%d)\n",md->name().data(),root->sli?root->sli->count():-1);
md->setRefItems(root->sli);
//printf("found enum %s nd=%p\n",name.data(),nd);
bool defSet=FALSE;
......@@ -6755,8 +6756,9 @@ static void findEnumDocumentation(EntryNav *rootNav)
{
md->setMemberGroupId(root->mGrpId);
}
md->addSectionsToDefinition(root->anchors);
md->setRefItems(root->sli);
GroupDef *gd=md->getGroupDef();
if (gd==0 &&root->groups->first()!=0) // member not grouped but out-of-line documentation is
......
......@@ -590,7 +590,7 @@ void FTVHelp::generateTreeView(QString* OutString)
//t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\">\n";
t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">\n";
t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n";
t << "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\"/>\n";
t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n";
t << "<title>";
if (Config_getString("PROJECT_NAME").isEmpty())
{
......
......@@ -672,7 +672,7 @@ static void writeDefaultHeaderFile(QTextStream &t, const char *title,
// t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n";
t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
t << "<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n"
"<meta http-equiv=\"Content-Type\" content=\"text/html;charset=UTF-8\"/>\n"
"<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n"
"<title>";
t << convertToHtml(title);
t << "</title>\n";
......
......@@ -2523,6 +2523,7 @@ void writeSearchIndex()
t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""
" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl;
t << "<html><head><title></title>" << endl;
t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>" << endl;
t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>" << endl;
t << "<script type=\"text/javascript\" src=\"search.js\"></script>" << endl;
t << "</head>" << endl;
......@@ -2552,17 +2553,30 @@ void writeSearchIndex()
<< "return searchResults.Nav(event," << itemCount << ")\" "
<< "onkeyup=\""
<< "return searchResults.Nav(event," << itemCount << ")\" "
<< "class=\"SRSymbol\" href=\"../"
<< d->getOutputFileBase() << Doxygen::htmlFileExtension;
<< "class=\"SRSymbol\" ";
if (!d->getReference().isEmpty())
{
QCString *dest;
t << "doxygen=\"" << d->getReference() << ":../";
if ((dest=Doxygen::tagDestinationDict[d->getReference()])) t << *dest << "/";
t << "\" ";
t << "href=\"../";
if ((dest=Doxygen::tagDestinationDict[d->getReference()])) t << *dest << "/";
}
else
{
t << "href=\"../";
}
t << d->getOutputFileBase() << Doxygen::htmlFileExtension;
if (isMemberDef)
{
t << "#" << ((MemberDef *)d)->anchor();
}
t << "\" target=\"";
if (treeView) t << "basefrm"; else t << "_parent";
t << "\">"
<< convertToXML(d->localName())
<< "</a>" << endl;
t << "\">";
t << convertToXML(d->localName());
t << "</a>" << endl;
if (d->getOuterScope()!=Doxygen::globalScope)
{
t << " <span class=\"SRScope\">"
......@@ -2622,8 +2636,21 @@ void writeSearchIndex()
<< "onkeyup=\""
<< "return searchResults.NavChild(event,"
<< itemCount << "," << childCount << ")\" "
<< "class=\"SRScope\" href=\"../" <<
d->getOutputFileBase() << Doxygen::htmlFileExtension;
<< "class=\"SRScope\" ";
if (!d->getReference().isEmpty())
{
QCString *dest;
t << "doxygen=\"" << d->getReference() << ":../";
if ((dest=Doxygen::tagDestinationDict[d->getReference()])) t << *dest << "/";
t << "\" ";
t << "href=\"../";
if ((dest=Doxygen::tagDestinationDict[d->getReference()])) t << *dest << "/";
}
else
{
t << "href=\"../";
}
t << d->getOutputFileBase() << Doxygen::htmlFileExtension;
if (isMemberDef)
{
t << "#" << ((MemberDef *)d)->anchor();
......@@ -2791,6 +2818,7 @@ void writeSearchIndex()
t << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" "
"\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">" << endl;
t << "<html><head><title></title>" << endl;
t << "<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>" << endl;
t << "<link rel=\"stylesheet\" type=\"text/css\" href=\"search.css\"/>" << endl;
t << "<script type=\"text/javascript\" src=\"search.js\"></script>" << endl;
t << "</head>" << endl;
......
......@@ -28,6 +28,8 @@
#include "doxygen.h"
#include "docparser.h"
#include "marshal.h"
#include "entry.h"
#include "md5.h"
//static QCString idToName(int id)
//{
......@@ -55,6 +57,8 @@ MemberGroup::MemberGroup(Definition *parent,
m_numDocMembers = -1;
m_parent = parent;
m_docFile = docFile;
m_xrefListItems = 0;
doc.prepend("<a name=\""+anchor()+"\"></a>");
//printf("Member group docs=`%s'\n",doc.data());
}
......@@ -200,9 +204,9 @@ void MemberGroup::distributeMemberGroupDocumentation()
}
}
int MemberGroup::varCount() const
{
return memberList->varCount();
int MemberGroup::varCount() const
{
return memberList->varCount();
}
int MemberGroup::funcCount() const
......@@ -255,9 +259,23 @@ void MemberGroup::setInGroup(bool b)
memberList->setInGroup(b);
}
QCString MemberGroup::anchor() const
{
uchar md5_sig[16];
QCString sigStr(33);
MD5Buffer((const unsigned char *)grpHeader.data(),grpHeader.length(),md5_sig);
MD5SigToString(md5_sig,sigStr.data(),33);
return "amgrp"+sigStr;
}
void MemberGroup::addListReferences(Definition *def)
{
memberList->addListReferences(def);
if (m_xrefListItems && def)
{
addRefItem(m_xrefListItems,theTranslator->trGroup(TRUE,TRUE),
def->getOutputFileBase()+"#"+anchor(),grpHeader,0);
}
}
void MemberGroup::findSectionsInDocumentation()
......@@ -280,6 +298,7 @@ void MemberGroup::marshal(StorageIntf *s)
marshalInt(s,m_numDocMembers);
marshalObjPointer(s,m_parent);
marshalQCString(s,m_docFile);
marshalItemInfoList (Doxygen::symbolStorage,m_xrefListItems);
}
void MemberGroup::unmarshal(StorageIntf *s)
......@@ -296,5 +315,41 @@ void MemberGroup::unmarshal(StorageIntf *s)
m_numDocMembers = unmarshalInt(s);
m_parent = (Definition *)unmarshalObjPointer(s);
m_docFile = unmarshalQCString(s);
m_xrefListItems = unmarshalItemInfoList (Doxygen::symbolStorage);
}
void MemberGroup::setRefItems(const QList<ListItemInfo> *sli)
{
if (sli)
{
// deep copy the list
if (m_xrefListItems==0)
{
m_xrefListItems=new QList<ListItemInfo>;
m_xrefListItems->setAutoDelete(TRUE);
}
QListIterator<ListItemInfo> slii(*sli);
ListItemInfo *lii;
for (slii.toFirst();(lii=slii.current());++slii)
{
m_xrefListItems->append(new ListItemInfo(*lii));
}
}
}
//--------------------------------------------------------------------------
void MemberGroupInfo::setRefItems(const QList<ListItemInfo> *sli)
{
if (!sli) return;
if (m_sli==0)
{
m_sli = new QList<ListItemInfo>;
m_sli->setAutoDelete(TRUE);
}
QListIterator<ListItemInfo> slii(*sli);
ListItemInfo *ili;
for (slii.toFirst();(ili=slii.current());++slii)
{
m_sli->append(new ListItemInfo(*ili));
}
}
......@@ -34,6 +34,7 @@ class GroupDef;
class OutputList;
class Definition;
class StorageIntf;
struct ListItemInfo;
class MemberGroup
{
......@@ -74,8 +75,10 @@ class MemberGroup
int numDocMembers() const;
void setInGroup(bool b);
void addListReferences(Definition *d);
void setRefItems(const QList<ListItemInfo> *sli);
MemberList *members() const { return memberList; }
Definition *parent() const { return m_parent; }
QCString anchor() const;
void marshal(StorageIntf *s);
void unmarshal(StorageIntf *s);
......@@ -93,6 +96,7 @@ class MemberGroup
int m_numDocMembers;
Definition *m_parent;
QCString m_docFile;
QList<ListItemInfo> *m_xrefListItems;
};
class MemberGroupList : public QList<MemberGroup>
......@@ -113,12 +117,17 @@ class MemberGroupSDict : public SIntDict<MemberGroup>
~MemberGroupSDict() {}
};
struct MemberGroupInfo
{
MemberGroupInfo() : m_sli(0) {}
~MemberGroupInfo() { delete m_sli; m_sli=0; }
void setRefItems(const QList<ListItemInfo> *sli);
QCString header;
QCString doc;
QCString docFile;
QCString compoundName;
QList<ListItemInfo> *m_sli;
};
//class MemberGroupDict : public QIntDict<MemberGroup>
......
......@@ -179,26 +179,31 @@ static Define *isDefined(const char *name)
static QDict<void> g_allIncludes(10009);
static FileState *checkAndOpenFile(const QCString &fileName)
static FileState *checkAndOpenFile(const QCString &fileName,bool &alreadyIncluded)
{
alreadyIncluded = FALSE;
FileState *fs = 0;
//printf("checkAndOpenFile(%s)\n",absName.data());
//printf("checkAndOpenFile(%s)\n",fileName.data());
QFileInfo fi(fileName);
if (fi.exists() && fi.isFile())
{
QCString absName = convertToQCString(fi.absFilePath());
#if 1
// global guard
if (g_allIncludes.find(absName)) return 0; // already done
g_allIncludes.insert(absName,(void *)0x8);
if (g_curlyCount==0) // not #include inside { ... }
{
if (g_allIncludes.find(absName)==0)
{
alreadyIncluded = TRUE;
//printf(" already included 1\n");
return 0; // already done
}
g_allIncludes.insert(absName,(void *)0x8);
}
// check include stack for absName
#endif
#if 0 // stack based recusive inclusion detection
QStack<FileState> tmpStack;
g_includeStack.setAutoDelete(FALSE);
bool alreadyIncluded=FALSE;
while ((fs=g_includeStack.pop()))
{
if (fs->fileName==absName) alreadyIncluded=TRUE;
......@@ -210,37 +215,52 @@ static FileState *checkAndOpenFile(const QCString &fileName)
}
g_includeStack.setAutoDelete(TRUE);
if (alreadyIncluded) return 0;
#endif
if (alreadyIncluded)
{
//printf(" already included 2\n");
return 0;
}
//printf("#include %s\n",absName.data());
fs = new FileState;
alreadyIncluded = FALSE;
QCString filterName = getFileFilter(absName);
if (!filterName.isEmpty())
{
fs->isPlainFile = FALSE;
QCString cmd = filterName+" \""+absName+"\"";
fs->filePtr=portable_popen(cmd,"r");
if (!fs->filePtr) err("Error: could not execute filter %s\n",cmd.data());
if (!fs->filePtr)
{
err("Error: could not execute filter %s, reason: %s\n",cmd.data(),
strerror(errno));
}
}
else
{
fs->isPlainFile = TRUE;
fs->filePtr=fopen(absName,"r");
if (!fs->filePtr) err("Error: could not open file %s for reading\n",absName.data());
if (!fs->filePtr)
{
err("Error: could not open file %s for reading, reason: %s \n",
absName.data(),strerror(errno));
}
}
if (!fs->filePtr) // error -> cleanup
{
delete fs;
fs=0;
}
fs->oldYYin = preYYin;
else
{
fs->oldYYin = preYYin;
}
}
return fs;
}
static FileState *findFile(const char *fileName,bool localInclude)
static FileState *findFile(const char *fileName,bool localInclude,bool &alreadyIncluded)
{
//printf("** findFile(%s,%d) g_yyFileName=%s\n",fileName,localInclude,g_yyFileName.data());
if (localInclude && !g_yyFileName.isEmpty())
......@@ -249,13 +269,17 @@ static FileState *findFile(const char *fileName,bool localInclude)
if (fi.exists())
{
QCString absName = QCString(fi.dirPath(TRUE).data())+"/"+fileName;
FileState *fs = checkAndOpenFile(absName);
FileState *fs = checkAndOpenFile(absName,alreadyIncluded);
if (fs)
{
setFileName(absName);
g_yyLineNr=1;
return fs;
}
else if (alreadyIncluded)
{
return 0;
}
}
}
if (g_pathList==0)
......@@ -266,13 +290,17 @@ static FileState *findFile(const char *fileName,bool localInclude)
while (s)
{
QCString absName = (QCString)s+"/"+fileName;
FileState *fs = checkAndOpenFile(absName);
FileState *fs = checkAndOpenFile(absName,alreadyIncluded);
if (fs)
{
setFileName(absName);
g_yyLineNr=1;
return fs;
}
else if (alreadyIncluded)
{
return 0;
}
s=g_pathList->next();
}
......@@ -1081,10 +1109,10 @@ void addDefine()
int l=g_defLitText.find('\n');
if (l>0 && g_defLitText.left(l).stripWhiteSpace()=="\\")
{
// strip first line if it only contains a slash
// strip first line if it only contains a slash
g_defLitText = g_defLitText.right(g_defLitText.length()-l-1);
}
else if (l>0)
else if (l>0)
{
// align the items on the first line with the items on the second line
int k=l+1;
......@@ -1094,7 +1122,7 @@ void addDefine()
g_defLitText=g_defLitText.mid(l+1,k-l-1)+g_defLitText.stripWhiteSpace();
}
md->setInitializer(g_defLitText.stripWhiteSpace());
md->setFileDef(g_inputFileDef);
md->setDefinition("#define "+g_defName);
......@@ -1106,7 +1134,7 @@ void addDefine()
}
mn->append(md);
if (g_yyFileDef) g_yyFileDef->insertMember(md);
//Define *d;
//if ((d=defineDict[g_defName])==0) defineDict.insert(g_defName,newDefine());
}
......@@ -1114,7 +1142,7 @@ void addDefine()
static inline void outputChar(char c)
{
if (g_includeStack.isEmpty() || g_curlyCount>0) g_outputBuf->addChar(c);
}
}
static inline void outputArray(const char *a,int len)
{
......@@ -1125,32 +1153,34 @@ static void readIncludeFile(const QCString &inc)
{
if (!Config_getBool("SEARCH_INCLUDES")) return; // do not read include files
uint i=0;
// find the start of the include file name
while (i<inc.length() &&
(inc.at(i)==' ' || inc.at(i)=='"' || inc.at(i)=='<')
) i++;
uint s=i;
// was it a local include?
bool localInclude = s>0 && inc.at(s-1)=='"';
// find the end of the include file name
while (i<inc.length() && inc.at(i)!='"' && inc.at(i)!='>') i++;
while (i<inc.length() && inc.at(i)!='"' && inc.at(i)!='>') i++;
if (s<inc.length() && i>s) // valid include file name found
{
// extract include path+name
QCString incFileName=inc.mid(s,i-s).stripWhiteSpace();
QCString incFileName=inc.mid(s,i-s).stripWhiteSpace();
QCString oldFileName = g_yyFileName.copy();
FileDef *oldFileDef = g_yyFileDef;
int oldLineNr = g_yyLineNr;
//printf("Searching for `%s'\n",incFileName.data());
// findFile will overwrite g_yyFileDef if found
FileState *fs;
if ((fs=findFile(incFileName,localInclude))) // see if the include file can be found
bool alreadyIncluded = FALSE;
//printf("calling findFile(%s)\n",incFileName.data());
if ((fs=findFile(incFileName,localInclude,alreadyIncluded))) // see if the include file can be found
{
//printf("Found include file!\n");
if (Debug::isFlagSet(Debug::Preprocessor))
......@@ -1158,7 +1188,7 @@ static void readIncludeFile(const QCString &inc)
for (i=0;i<g_includeStack.count();i++) msg(" ");
msg("#include %s: parsing...\n",incFileName.data());
}
if (oldFileDef)
if (oldFileDef)
{
// add include dependency to the file in which the #include was found
oldFileDef->addIncludeDependency(g_yyFileDef,incFileName,localInclude,g_isImported);
......@@ -1181,14 +1211,15 @@ static void readIncludeFile(const QCString &inc)
QCString lineStr(g_yyFileName.length()+20);
lineStr.sprintf("# 1 \"%s\" 1\n",g_yyFileName.data());
outputArray(lineStr.data(),lineStr.length());
//fprintf(stderr,"Switching to include file %s\n",incFileName.data());
preYYin=fs->filePtr;
yy_switch_to_buffer(yy_create_buffer(preYYin, YY_BUF_SIZE));
}
}
else
{
if (oldFileDef)
//printf(" calling findFile(%s) alreadyInc=%d\n",incFileName.data(),alreadyIncluded);
if (oldFileDef)
{
bool ambig;
FileDef *fd = findFileDef(Doxygen::inputNameDict,incFileName,ambig);
......@@ -1199,7 +1230,7 @@ static void readIncludeFile(const QCString &inc)
if (fd)
{
//printf("Adding include dependency (2) %s->%s ambig=%d\n",oldFileDef->name().data(),fd->name().data(),ambig);
fd->addIncludedByDependency(oldFileDef,oldFileDef->docName(),localInclude,g_isImported);
fd->addIncludedByDependency(oldFileDef,oldFileDef->docName(),localInclude,g_isImported);
}
}
if (Debug::isFlagSet(Debug::Preprocessor))
......@@ -1207,7 +1238,7 @@ static void readIncludeFile(const QCString &inc)
msg("#include %s: not found or already included! skipping...\n",incFileName.data());
//printf("Error: include file %s not found\n",yytext);
}
if (g_curlyCount>0) // failed to find #include inside { ... }
if (g_curlyCount>0 && !alreadyIncluded) // failed to find #include inside { ... }
{
warn(g_yyFileName,g_yyLineNr,"Warning: include file %s not found, perhaps you forgot to add its directory to INCLUDE_PATH?",incFileName.data());
}
......
......@@ -20,6 +20,8 @@
// Updates:
// --------
// 2009/08/24 -
// 2008/06/09 - Corrections in trLegendDocs().
// 2007/11/13 - Update for "new since 1.5.4 (mainly for Fortran)".
// 2007/03/20 - removing decode(), conversion of literals to UTF-8.
// 2006/06/13 - translation of the trEnumerationValueDocumentation().
......@@ -77,7 +79,7 @@
// something else. It is difficult to find the general translation
// for all kinds in the Czech language.
class TranslatorCzech : public TranslatorAdapter_1_6_0
class TranslatorCzech : public Translator
{
public:
// --- Language control methods -------------------
......@@ -1053,7 +1055,7 @@ class TranslatorCzech : public TranslatorAdapter_1_6_0
/*! page explaining how the dot graph's should be interpreted */
virtual QCString trLegendDocs()
{
QCString result(
return
"Zde naleznete vysvětlení, jak mají být interpretovány grafy, "
"které byly generovány programem doxygen.<p>\n"
"Uvažujte následující příklad:\n"
......@@ -1064,22 +1066,21 @@ class TranslatorCzech : public TranslatorAdapter_1_6_0
"/*! Třída, u které došlo k ořezání grafu. Vztah dědičnosti "
"je skryt. */\n"
"class Truncated : public Invisible { };\n\n"
"/* Třída, která není dokumentována komentáři programu doxygen. */\n"
"class Undocumented { };\n\n"
"/*! Bázová třída děděná veřejně (public inheritance). */\n"
"class PublicBase : public Truncated { };\n\n"
"/*! Šablona třídy. */\n"
"template<class T> class Templ { };\n\n"
"/*! Bázová třída, použitá pro chráněné dědění "
"(protected inheritance). */\n"
"class ProtectedBase { };\n\n"
"/*! Bázová třída, využitá pro privátní dědění "
"(private inheritance). */\n"
"class PrivateBase { };\n\n"
"/* Třída, která není dokumentována komentáři programu doxygen. */\n"
"class Undocumented { };\n\n"
"/*! Šablona třídy. */\n"
"template<class T> class Templ { };\n\n"
"/*! Třída, která je využívána třídou Inherited. */\n"
"class Used { };\n\n"
"/*! Odvozená třída, která různým způsobem dědí z více bázových "
"tříd. */\n"
"/*! Odvozená třída, která dědí z více tříd. */\n"
"class Inherited : public PublicBase,\n"
" protected ProtectedBase,\n"
" private PrivateBase,\n"
......@@ -1090,13 +1091,12 @@ class TranslatorCzech : public TranslatorAdapter_1_6_0
" Used *m_usedClass;\n"
"};\n"
"\\endcode\n"
"Pokud je položka \\c MAX_DOT_GRAPH_HEIGHT konfiguračního souboru "
"nastavena na hodnotu 200, bude vygenerován následující graf:"
"K výše uvedenému bude vygenerován následující graf:"
"<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
"<p>\n"
"Bloky (tj. uzly) v uvedeném grafu mají následující význam:\n"
"<ul>\n"
"<li>Černě vyplněný obdélník reprezentuje strukturu nebo třídu, "
"<li>Šedě vyplněný obdélník reprezentuje strukturu nebo třídu, "
"pro kterou byl graf generován.\n"
"<li>Obdélník s černým obrysem označuje dokumentovanou "
"strukturu nebo třídu.\n"
......@@ -1125,9 +1125,7 @@ class TranslatorCzech : public TranslatorAdapter_1_6_0
"a šablonou třídy, na základě které byla\n"
"instance šablony vytvořena. V popisu šipky jsou uvedeny příslušné"
" parametry šablony.\n"
"</ul>\n");
return result;
"</ul>\n";
}
/*! text for the link to the legend page */
virtual QCString trLegend()
......@@ -1816,6 +1814,40 @@ class TranslatorCzech : public TranslatorAdapter_1_6_0
return "Omezení typů (Type Constraints)";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.6.0 (mainly for the new search engine)
//////////////////////////////////////////////////////////////////////////
/*! directory relation for \a name */
virtual QCString trDirRelation(const char *name)
{
return "Relace "+QCString(name);
}
/*! Loading message shown when loading search results */
virtual QCString trLoading()
{
return "Načítám...";
}
/*! Label used for search results in the global namespace */
virtual QCString trGlobalNamespace()
{
return "Globální prostor jmen";
}
/*! Message shown while searching */
virtual QCString trSearching()
{
return "Vyhledávám...";
}
/*! Text shown when no search results are found */
virtual QCString trNoMatches()
{
return "Nic se nenašlo";
}
};
#endif // TRANSLATOR_CZ_H
......@@ -14,7 +14,7 @@
* input used in their production; they are not affected by this license.
*
*/
/*
* Bronne vir hierdie vertaling (Sources for this translation):
* Die Stigting vir Afrikaans se rekenaartermelys:
......@@ -26,7 +26,7 @@
#ifndef TRANSLATOR_ZA_H
#define TRANSLATOR_ZA_H
class TranslatorAfrikaans : public TranslatorAdapter_1_4_6
class TranslatorAfrikaans : public TranslatorAdapter_1_6_0
{
public:
......@@ -1022,7 +1022,7 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_4_6
" protected ProtectedBase,\n"
" private PrivateBase,\n"
" public Ongedokumenteer,\n"
" public Templ<int>\n"
" public Templ<int>\n"
"{\n"
" private:\n"
" Used *m_usedClass;\n"
......@@ -1260,7 +1260,7 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_4_6
{
QCString result((first_capital ? "Bladsy" : "bladsy"));
if (!singular) result+="e";
return result;
return result;
}
/*! This is used for translation of the word that will possibly
......@@ -1268,12 +1268,12 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_4_6
* of the category.
*/
virtual QCString trMember(bool first_capital, bool singular)
{
{
QCString result((first_capital ? "Lid" : "lid"));
if (!singular) result = (first_capital ? "Lede" : "lede");
return result;
}
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
......@@ -1548,8 +1548,220 @@ class TranslatorAfrikaans : public TranslatorAdapter_1_4_6
"funksie in die argument(e) wat dit aanvaar.";
}
//////////////////////////////////////////////////////////////////////////
// new since 1.4.6
//////////////////////////////////////////////////////////////////////////
/*! This is used to introduce a caller (or called-by) graph */
virtual QCString trCallerGraph()
{
return "Hier is die roep skema vir die funksie:";
}
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration values
*/
virtual QCString trEnumerationValueDocumentation()
{ return "Enumerator Dokumentasie"; }
//////////////////////////////////////////////////////////////////////////
// new since 1.5.4 (mainly for Fortran)
//////////////////////////////////////////////////////////////////////////
/*! header that is put before the list of member subprograms (Fortran). */
virtual QCString trMemberFunctionDocumentationFortran()
{ return "Lede Funksie/Subroetine Dokumentasie"; }
/*! This is put above each page as a link to the list of annotated data types (Fortran). */
virtual QCString trCompoundListFortran()
{ return "Data Tipes Lys"; }
/*! This is put above each page as a link to all members of compounds (Fortran). */
virtual QCString trCompoundMembersFortran()
{ return "Data Velde"; }
/*! This is an introduction to the annotated compound list (Fortran). */
virtual QCString trCompoundListDescriptionFortran()
{ return "Hier is die data tipes met kort beskrywings:"; }
/*! This is an introduction to the page with all data types (Fortran). */
virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
{
QCString result="Hier is 'n lys van alle ";
if (!extractAll)
{
result+="gedokumenteerde ";
}
result+="data tipe lede";
result+=" met skakels na ";
if (!extractAll)
{
result+="die data strukture dokumentasie vir elke lid";
}
else
{
result+="die data tipes waaraan hulle behoort:";
}
return result;
}
/*! This is used in LaTeX as the title of the chapter with the
* annotated compound index (Fortran).
*/
virtual QCString trCompoundIndexFortran()
{ return "Data Tipe Indeks"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all data types (Fortran).
*/
virtual QCString trTypeDocumentation()
{ return "Data Tipe Dokumentasie"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) subprograms (Fortran).
*/
virtual QCString trSubprograms()
{ return "Funksies/Subroetines"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for subprograms (Fortran)
*/
virtual QCString trSubprogramDocumentation()
{ return "Funksies/Subroetine Dokumentasie"; }
/*! This is used in the documentation of a file/namespace/group before
* the list of links to documented compounds (Fortran)
*/
virtual QCString trDataTypes()
{ return "Data Tipes"; }
/*! used as the title of page containing all the index of all modules (Fortran). */
virtual QCString trModulesList()
{ return "Modules Lys"; }
/*! used as an introduction to the modules list (Fortran) */
virtual QCString trModulesListDescription(bool extractAll)
{
QCString result="Hier is 'n lys van alle ";
if (!extractAll) result+="gedokumenteerde ";
result+="modules met kort beskrywings:";
return result;
}
/*! used as the title of the HTML page of a module/type (Fortran) */
virtual QCString trCompoundReferenceFortran(const char *clName,
ClassDef::CompoundType compType,
bool isTemplate)
{
QCString result=(QCString)clName;
switch(compType)
{
case ClassDef::Class: result+=" Module"; break;
case ClassDef::Struct: result+=" Tipe"; break;
case ClassDef::Union: result+=" Unie"; break;
case ClassDef::Interface: result+=" Interflak"; break;
case ClassDef::Protocol: result+=" Protokol"; break;
case ClassDef::Category: result+=" Kategorie"; break;
case ClassDef::Exception: result+=" Eksepsie"; break;
}
if (isTemplate) result+=" Template";
result+=" Bron";
return result;
}
/*! used as the title of the HTML page of a module (Fortran) */
virtual QCString trModuleReference(const char *namespaceName)
{
QCString result=namespaceName;
result+=" Module Bron";
return result;
}
/*! This is put above each page as a link to all members of modules. (Fortran) */
virtual QCString trModulesMembers()
{ return "Module Lede"; }
/*! This is an introduction to the page with all modules members (Fortran) */
virtual QCString trModulesMemberDescription(bool extractAll)
{
QCString result="Hier is 'n lys van alle ";
if (!extractAll) result+="gedokumenteerde ";
result+="module lede met skakels na ";
if (extractAll)
{
result+="die module dokumentasie vir elke lid:";
}
else
{
result+="die modules waaraan hulle behoort:";
}
return result;
}
/*! This is used in LaTeX as the title of the chapter with the
* index of all modules (Fortran).
*/
virtual QCString trModulesIndex()
{ return "Modules Indeks"; }
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trModule(bool first_capital, bool singular)
{
QCString result((first_capital ? "Module" : "module"));
if (!singular) result+="s";
return result;
}
/*! This is put at the bottom of a module documentation page and is
* followed by a list of files that were used to generate the page.
*/
virtual QCString trGeneratedFromFilesFortran(ClassDef::CompoundType compType,
bool single)
{
// single is true implies a single file
QCString result=(QCString)"The documentation for this ";
switch(compType)
{
case ClassDef::Class: result+="module"; break;
case ClassDef::Struct: result+="tipe"; break;
case ClassDef::Union: result+="unie"; break;
case ClassDef::Interface: result+="Interflak"; break;
case ClassDef::Protocol: result+="protokcol"; break;
case ClassDef::Category: result+="kategorie"; break;
case ClassDef::Exception: result+="eksepsie"; break;
}
result+=" is gegenereer vanaf die foldende leer";
if (single) result+=":"; else result+="s:";
return result;
}
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trType(bool first_capital, bool singular)
{
QCString result((first_capital ? "Tipe" : "tipe"));
if (!singular) result+="s";
return result;
}
/*! This is used for translation of the word that will possibly
* be followed by a single name or by a list of names
* of the category.
*/
virtual QCString trSubprogram(bool first_capital, bool singular)
{
QCString result((first_capital ? "Subprogram" : "subprogram"));
if (!singular) result+="me";
return result;
}
/*! C# Type Constraint list */
virtual QCString trTypeConstraints()
{
return "Tipe Limiete";
}
};
#endif
......@@ -5399,6 +5399,7 @@ void addMembersToMemberGroup(MemberList *ml,
}
md = ml->take(index); // remove from member list
mg->insertMember(md); // insert in member group
mg->setRefItems(info->m_sli);
md->setMemberGroup(mg);
continue;
}
......@@ -6502,7 +6503,7 @@ void initDefaultExtensionMapping()
updateLanguageMapping(".f90", "fortran");
updateLanguageMapping(".vhd", "vhdl");
updateLanguageMapping(".vhdl", "vhdl");
updateLanguageMapping(".xml", "dbusxml");
//updateLanguageMapping(".xml", "dbusxml");
}
SrcLangExt getLanguageFromFileName(const QCString fileName)
......
......@@ -579,7 +579,7 @@ static void startFontClass(const char *s)
static void writeFont(const char *s,const char* text)
{
if (s==0 || text==0) return;
printf("writeFont(%d,\"%s\")\n",g_yyLineNr,text);
//printf("writeFont(%d,\"%s\")\n",g_yyLineNr,text);
g_code->startFontClass(s);
g_code->codify(text);
g_code->endFontClass();
......
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