summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authordimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2009-08-25 11:45:32 (GMT)
committerdimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7>2009-08-25 11:45:32 (GMT)
commit0c8b6ca69f951ce8c94902764cf036d6a79e5102 (patch)
tree1eb87ba34df4235398b79f257b2af06a38a3f2b2 /src
parent347f313fd93041ce8acf08c4927cb763d5f2d3cd (diff)
downloadDoxygen-0c8b6ca69f951ce8c94902764cf036d6a79e5102.zip
Doxygen-0c8b6ca69f951ce8c94902764cf036d6a79e5102.tar.gz
Doxygen-0c8b6ca69f951ce8c94902764cf036d6a79e5102.tar.bz2
Release-1.6.1
Diffstat (limited to 'src')
-rw-r--r--src/commentscan.l3
-rw-r--r--src/config.xml8
-rw-r--r--src/configoptions.cpp12
-rw-r--r--src/dbusxmlscanner.cpp17
-rw-r--r--src/dirdef.cpp10
-rw-r--r--src/doctokenizer.l2
-rw-r--r--src/doxygen.cpp4
-rw-r--r--src/ftvhelp.cpp2
-rw-r--r--src/htmlgen.cpp2
-rw-r--r--src/index.cpp42
-rw-r--r--src/membergroup.cpp61
-rw-r--r--src/membergroup.h9
-rw-r--r--src/pre.l101
-rw-r--r--src/translator_cz.h60
-rw-r--r--src/translator_za.h226
-rw-r--r--src/util.cpp3
-rw-r--r--src/vhdlcode.l2
17 files changed, 480 insertions, 84 deletions
diff --git a/src/commentscan.l b/src/commentscan.l
index 88f4008..d7d064d 100644
--- a/src/commentscan.l
+++ b/src/commentscan.l
@@ -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);
diff --git a/src/config.xml b/src/config.xml
index aa09dcb..a2cb0af 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -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'/>
diff --git a/src/configoptions.cpp b/src/configoptions.cpp
index 9d9c489..2aad2bc 100644
--- a/src/configoptions.cpp
+++ b/src/configoptions.cpp
@@ -636,6 +636,14 @@ void addConfigOptions(Config *cfg)
);
//----
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"
"then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy\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");
diff --git a/src/dbusxmlscanner.cpp b/src/dbusxmlscanner.cpp
index 8a07d81..514039f 100644
--- a/src/dbusxmlscanner.cpp
+++ b/src/dbusxmlscanner.cpp
@@ -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);
}
diff --git a/src/dirdef.cpp b/src/dirdef.cpp
index 6a0c12d..56f713c 100644
--- a/src/dirdef.cpp
+++ b/src/dirdef.cpp
@@ -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
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
index 399371e..cc9fbad 100644
--- a/src/doctokenizer.l
+++ b/src/doctokenizer.l
@@ -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
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index d256e8f..f53a291 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -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
diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp
index 17b4466..c1fcf54 100644
--- a/src/ftvhelp.cpp
+++ b/src/ftvhelp.cpp
@@ -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())
{
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 66d3ea4..fbea282 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -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";
diff --git a/src/index.cpp b/src/index.cpp
index 39171a2..6646075 100644
--- a/src/index.cpp
+++ b/src/index.cpp
@@ -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;
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
index f20ae0f..a191354 100644
--- a/src/membergroup.cpp
+++ b/src/membergroup.cpp
@@ -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));
+ }
+}
diff --git a/src/membergroup.h b/src/membergroup.h
index e7bd457..ddef6fc 100644
--- a/src/membergroup.h
+++ b/src/membergroup.h
@@ -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>
diff --git a/src/pre.l b/src/pre.l
index 1d04957..fad03e0 100644
--- a/src/pre.l
+++ b/src/pre.l
@@ -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());
}
diff --git a/src/translator_cz.h b/src/translator_cz.h
index cd02dac..daad247 100644
--- a/src/translator_cz.h
+++ b/src/translator_cz.h
@@ -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
diff --git a/src/translator_za.h b/src/translator_za.h
index 1e45be3..2a5f299 100644
--- a/src/translator_za.h
+++ b/src/translator_za.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
-
diff --git a/src/util.cpp b/src/util.cpp
index d6440d3..c164c2d 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -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)
diff --git a/src/vhdlcode.l b/src/vhdlcode.l
index c5df9f0..57d5eaf 100644
--- a/src/vhdlcode.l
+++ b/src/vhdlcode.l
@@ -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();