summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/cite.cpp18
-rw-r--r--src/code.l9
-rw-r--r--src/definition.cpp58
-rw-r--r--src/definition.h4
-rw-r--r--src/doxygen.cpp60
-rw-r--r--src/entry.cpp1
-rw-r--r--src/filestorage.h135
-rw-r--r--src/gifenc.cpp287
-rw-r--r--src/gifenc.h90
-rw-r--r--src/htmlgen.cpp24
-rw-r--r--src/latexgen.cpp10
-rw-r--r--src/layout.cpp12
-rw-r--r--src/layout.h3
-rw-r--r--src/marshal.cpp4
-rw-r--r--src/marshal.h67
-rw-r--r--src/memberdef.cpp186
-rw-r--r--src/memberlist.cpp14
-rw-r--r--src/store.cpp31
-rw-r--r--src/store.h4
-rw-r--r--src/tclscanner.h4
-rw-r--r--src/translator_fa.h6
-rw-r--r--src/translator_fr.h413
-rw-r--r--src/translator_it.h2
-rw-r--r--src/util.cpp9
-rw-r--r--src/util.h3
25 files changed, 612 insertions, 842 deletions
diff --git a/src/cite.cpp b/src/cite.cpp
index 9d67afa..018d9cf 100644
--- a/src/cite.cpp
+++ b/src/cite.cpp
@@ -72,14 +72,18 @@ bool CiteDict::writeAux()
if (!bibFile.isEmpty() && bibFile.right(4)!=".bib") bibFile+=".bib";
if (!bibFile.isEmpty())
{
- QFileInfo fi(bibFile);
+ QFileInfo fi(bibFile); // open file (with .bib extension)
if (fi.exists())
{
if (!copyFile(bibFile,m_baseFileName+"_"+bibFile))
{
return FALSE;
}
- t << m_baseFileName+"_"+bibFile;
+ if (bibFile.right(4)==".bib")
+ {
+ bibFile = bibFile.left(bibFile.length()-4);
+ }
+ t << m_baseFileName+"_"+bibFile; // write name (without bib extension)
bibdata = citeDataList.next();
if (bibdata)
{
@@ -128,6 +132,10 @@ void CiteDict::writeLatexBibliography(FTextStream &t)
while (bibdata)
{
QCString bibFile = bibdata;
+ if (bibFile.right(4)==".bib")
+ {
+ bibFile = bibFile.left(bibFile.length()-4);
+ }
if (!bibFile.isEmpty())
{
t << bibFile;
@@ -268,11 +276,7 @@ void CiteDict::resolve()
QStrList &citeBibFiles = Config_getList("CITE_BIB_FILES");
if (citeBibFiles.count()==0 || m_entries.count()==0) return; // nothing to cite
- QCString &outputDirectory = Config_getString("OUTPUT_DIRECTORY");
- if (outputDirectory.isEmpty())
- {
- outputDirectory=QDir::currentDirPath();
- }
+ QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY");
QDir d(outputDirectory);
d.mkdir("bib");
diff --git a/src/code.l b/src/code.l
index 0f8506a..7821320 100644
--- a/src/code.l
+++ b/src/code.l
@@ -1716,12 +1716,11 @@ static int yyread(char *buf,int max_size)
B [ \t]
BN [ \t\n\r]
ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*
-SCOPESEP ("::"|"\\"){BN}*
-SCOPEPRE ({SCOPESEP}{ID}{BN}*)*{SCOPESEP}
-SCOPENAME {SCOPEPRE}?(("~"{BN}*)?{ID})
+SEP ("::"|"\\")
+SCOPENAME ({SEP}{BN}*)?({ID}{BN}*{SEP}{BN}*)*("~"{BN}*)?{ID}
TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
-SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?("::"|"\\"){BN}*)*)((~{BN}*)?{ID})
-SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*("::"|"\\"){BN}*)+
+SCOPETNAME (((({ID}{TEMPLIST}?){BN}*)?{SEP}{BN}*)*)((~{BN}*)?{ID})
+SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*{SEP}{BN}*)+
KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol"|"@optional"|"@required"|"@throw"|"@synthesize"|"@property")
KEYWORD ("asm"|"__assume"|"auto"|"class"|"const"|"delete"|"enum"|"explicit"|"extern"|"false"|"friend"|"gcnew"|"gcroot"|"get"|"inline"|"internal"|"mutable"|"namespace"|"new"|"nullptr"|"override"|"operator"|"pin_ptr"|"private"|"protected"|"public"|"raise"|"register"|"remove"|"self"|"set"|"sizeof"|"static"|"struct"|"__super"|"function"|"template"|"generic"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|{KEYWORD_OBJC})
FLOWKW ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"finally"|"for"|"foreach"|"for each"|"goto"|"if"|"return"|"switch"|"throw"|"throws"|"try"|"while"|"@try"|"@catch"|"@finally")
diff --git a/src/definition.cpp b/src/definition.cpp
index a8a7300..2abd726 100644
--- a/src/definition.cpp
+++ b/src/definition.cpp
@@ -48,8 +48,7 @@ class DefinitionImpl
public:
DefinitionImpl();
~DefinitionImpl();
- void init(const char *df,int dl,
- const char *n);
+ void init(const char *df, const char *n);
SectionDict *sectionDict; // dictionary of all sections, not accessible
@@ -76,7 +75,6 @@ class DefinitionImpl
// where the item was found
QCString defFileName;
- int defLine;
QCString defFileExt;
SrcLangExt lang;
@@ -103,8 +101,7 @@ DefinitionImpl::~DefinitionImpl()
delete inbodyDocs;
}
-void DefinitionImpl::init(const char *df,int dl,
- const char *n)
+void DefinitionImpl::init(const char *df, const char *n)
{
defFileName = df;
int lastDot = defFileName.findRev('.');
@@ -112,7 +109,6 @@ void DefinitionImpl::init(const char *df,int dl,
{
defFileExt = defFileName.mid(lastDot);
}
- defLine = dl;
QCString name = n;
if (name!="<globalScope>")
{
@@ -280,8 +276,9 @@ Definition::Definition(const char *df,int dl,
const char *d,bool isSymbol)
{
m_name = name;
+ m_defLine = dl;
m_impl = new DefinitionImpl;
- m_impl->init(df,dl,name);
+ m_impl->init(df,name);
m_isSymbol = isSymbol;
if (isSymbol) addToMap(name,this);
_setBriefDescription(b,df,dl);
@@ -892,12 +889,17 @@ void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
void Definition::_writeSourceRefList(OutputList &ol,const char *scopeName,
const QCString &text,MemberSDict *members,bool /*funcOnly*/)
{
+ LockingPtr<Definition> lock(this,this); // since this can be a memberDef
+ // accessing other memberDefs prevent
+ // it from being flushed to disk
static bool latexSourceCode = Config_getBool("LATEX_SOURCE_CODE");
static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
static bool refLinkSource = Config_getBool("REFERENCES_LINK_SOURCE");
ol.pushGeneratorState();
if (members)
{
+ members->sort();
+
ol.startParagraph();
ol.parseText(text);
ol.docify(" ");
@@ -1118,19 +1120,6 @@ QCString Definition::qualifiedName() const
count--;
return m_impl->qualifiedName;
}
-#if 0
- if (count>20)
- {
- printf("Definition::qualifiedName() Infinite recursion detected! Type=%d\n",definitionType());
- printf("Trace:\n");
- Definition *d = (Definition *)this;
- for (int i=0;d && i<20;i++)
- {
- printf(" %s\n",d->name().data());
- d = d->getOuterScope();
- }
- }
-#endif
//printf("start %s::qualifiedName() localName=%s\n",name().data(),m_impl->localName.data());
if (m_impl->outerScope==0)
@@ -1400,6 +1389,9 @@ QCString Definition::briefDescription() const
QCString Definition::briefDescriptionAsTooltip() const
{
makeResident();
+ LockingPtr<Definition> lock(this,this); // since this can be a memberDef
+ // accessing other memberDefs prevent
+ // it from being flushed to disk
if (m_impl->brief)
{
if (m_impl->brief->tooltip.isEmpty() && !m_impl->brief->doc.isEmpty())
@@ -1470,12 +1462,6 @@ QCString Definition::getDefFileExtension() const
return m_impl->defFileExt;
}
-int Definition::getDefLine() const
-{
- makeResident();
- return m_impl->defLine;
-}
-
bool Definition::isHidden() const
{
makeResident();
@@ -1559,14 +1545,10 @@ void Definition::setReference(const char *r)
SrcLangExt Definition::getLanguage() const
{
+ makeResident();
return m_impl->lang;
}
-void Definition::_setSymbolName(const QCString &name)
-{
- m_symbolName=name;
-}
-
void Definition::setHidden(bool b)
{
makeResident();
@@ -1585,13 +1567,21 @@ void Definition::setLocalName(const QCString name)
m_impl->localName=name;
}
+void Definition::setLanguage(SrcLangExt lang)
+{
+ makeResident();
+ m_impl->lang=lang;
+}
+
void Definition::makeResident() const
{
}
-void Definition::setLanguage(SrcLangExt lang)
+//---------------
+
+void Definition::_setSymbolName(const QCString &name)
{
- m_impl->lang=lang;
+ m_symbolName=name;
}
void Definition::flushToDisk() const
@@ -1617,7 +1607,6 @@ void Definition::flushToDisk() const
marshalBool (Doxygen::symbolStorage,m_impl->isArtificial);
marshalObjPointer (Doxygen::symbolStorage,m_impl->outerScope);
marshalQCString (Doxygen::symbolStorage,m_impl->defFileName);
- marshalInt (Doxygen::symbolStorage,m_impl->defLine);
marshalQCString (Doxygen::symbolStorage,m_impl->defFileExt);
marshalInt (Doxygen::symbolStorage,(int)m_impl->lang);
marshalUInt(Doxygen::symbolStorage,END_MARKER);
@@ -1650,7 +1639,6 @@ void Definition::loadFromDisk() const
m_impl->isArtificial = unmarshalBool (Doxygen::symbolStorage);
m_impl->outerScope = (Definition *)unmarshalObjPointer (Doxygen::symbolStorage);
m_impl->defFileName = unmarshalQCString (Doxygen::symbolStorage);
- m_impl->defLine = unmarshalInt (Doxygen::symbolStorage);
m_impl->defFileExt = unmarshalQCString (Doxygen::symbolStorage);
m_impl->lang = (SrcLangExt)unmarshalInt(Doxygen::symbolStorage);
marker = unmarshalUInt(Doxygen::symbolStorage);
diff --git a/src/definition.h b/src/definition.h
index 38a11b2..bf7f38c 100644
--- a/src/definition.h
+++ b/src/definition.h
@@ -179,7 +179,7 @@ class Definition : public DefinitionIntf, public LockableObj
QCString getDefFileExtension() const;
/*! returns the line number at which the definition was found */
- int getDefLine() const;
+ int getDefLine() const { return m_defLine; }
/*! Returns TRUE iff the definition is documented
* (which could be generated documentation)
@@ -348,7 +348,7 @@ class Definition : public DefinitionIntf, public LockableObj
QCString m_name;
bool m_isSymbol;
QCString m_symbolName;
-
+ int m_defLine;
};
class DefinitionList : public QList<Definition>, public DefinitionIntf
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index f9918ff..240db24 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -81,6 +81,7 @@
#include "vhdldocgen.h"
#include "eclipsehelp.h"
#include "cite.h"
+#include "filestorage.h"
#include "layout.h"
@@ -1175,6 +1176,29 @@ static void addClassToContext(EntryNav *rootNav)
fullName.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1);
cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
+ cd->setLanguage(root->lang);
+ cd->setHidden(root->hidden);
+ cd->setArtificial(root->artificial);
+ cd->setTypeConstraints(root->typeConstr);
+ //printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data());
+
+ ArgumentList *tArgList =
+ getTemplateArgumentsFromName(fullName,root->tArgLists);
+ //printf("class %s template args=%s\n",fullName.data(),
+ // tArgList ? tempArgListToString(tArgList).data() : "<none>");
+ cd->setTemplateArguments(tArgList);
+ cd->setProtection(root->protection);
+ cd->setIsStatic(root->stat);
+
+ // file definition containing the class cd
+ cd->setBodySegment(root->bodyLine,root->endBodyLine);
+ cd->setBodyDef(fd);
+
+ // see if the class is found inside a namespace
+ //bool found=addNamespace(root,cd);
+
+ // the empty string test is needed for extract all case
+ cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
cd->insertUsedFile(root->fileName);
// add class to the list
@@ -1415,7 +1439,7 @@ static void processTagLessClasses(ClassDef *rootCd,
ClassDef *tagParentCd,
const QCString &prefix,int count)
{
- printf("%d: processTagLessClasses %s\n",count,cd->name().data());
+ //printf("%d: processTagLessClasses %s\n",count,cd->name().data());
//printf("checking members for %s\n",cd->name().data());
if (cd->getInnerClasses())
{
@@ -1433,7 +1457,7 @@ static void processTagLessClasses(ClassDef *rootCd,
ClassDef *icd;
for (it.toFirst();(icd=it.current());++it)
{
- printf(" member %s: type='%s'\n",md->name().data(),type.data());
+ //printf(" member %s: type='%s'\n",md->name().data(),type.data());
//printf(" comparing '%s'<->'%s'\n",type.data(),icd->name().data());
if (type.find(icd->name())!=-1) // matching tag less struct/union
{
@@ -8900,6 +8924,7 @@ static void parseFiles(Entry *root,EntryNav *rootNav)
bool ambig;
FileDef *fd=findFileDef(Doxygen::inputNameDict,fileName,ambig);
ASSERT(fd!=0);
+ //printf("root->createNavigationIndex for %s\n",fd->name().data());
root->createNavigationIndex(rootNav,g_storage,fd);
s=g_inputFiles.next();
@@ -10168,7 +10193,8 @@ void parseInput()
if (cacheSize<0) cacheSize=0;
if (cacheSize>9) cacheSize=9;
Doxygen::symbolCache = new ObjCache(16+cacheSize); // 16 -> room for 65536 elements,
- // ~2.0 MByte "overhead"
+ // ~2.0 MByte "overhead"
+ //Doxygen::symbolCache = new ObjCache(1); // only to stress test cache behaviour
Doxygen::symbolStorage = new Store;
#ifdef HAS_SIGNALS
@@ -10331,15 +10357,6 @@ void parseInput()
* Parse source files *
**************************************************************************/
- parseFiles(root,rootNav);
- g_storage->close();
- if (!g_storage->open(IO_ReadOnly))
- {
- err("Failed to open temporary storage file %s for reading",
- Doxygen::entryDBFileName.data());
- exit(1);
- }
-
//printNavTree(rootNav,0);
// we are done with input scanning now, so free up the buffers used by flex
@@ -10352,6 +10369,20 @@ void parseInput()
//g_storage.close();
//exit(1);
+ if (Config_getBool("BUILTIN_STL_SUPPORT"))
+ {
+ addSTLClasses(rootNav);
+ }
+
+ parseFiles(root,rootNav);
+ g_storage->close();
+ if (!g_storage->open(IO_ReadOnly))
+ {
+ err("Failed to open temporary storage file %s for reading",
+ Doxygen::entryDBFileName.data());
+ exit(1);
+ }
+
/**************************************************************************
* Gather information *
**************************************************************************/
@@ -10364,11 +10395,6 @@ void parseInput()
buildDirectories();
findDirDocumentation(rootNav);
- if (Config_getBool("BUILTIN_STL_SUPPORT"))
- {
- addSTLClasses(rootNav);
- }
-
msg("Building namespace list...\n");
buildNamespaceList(rootNav);
findUsingDirectives(rootNav);
diff --git a/src/entry.cpp b/src/entry.cpp
index be5f9e4..8741ec2 100644
--- a/src/entry.cpp
+++ b/src/entry.cpp
@@ -22,6 +22,7 @@
#include "util.h"
#include "section.h"
#include "doxygen.h"
+#include "filestorage.h"
//------------------------------------------------------------------
diff --git a/src/filestorage.h b/src/filestorage.h
new file mode 100644
index 0000000..17d4498
--- /dev/null
+++ b/src/filestorage.h
@@ -0,0 +1,135 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
+#include <qfile.h>
+#include <assert.h>
+#include "store.h"
+
+
+#ifndef FILESTORAGE_H
+#define FILESTORAGE_H
+
+/** @brief Store implementation based on a file.
+ Writing is linear, after that the file is re-opened for reading.
+ Reading is random (seek+read).
+ */
+class FileStorage : public StorageIntf
+{
+ public:
+ FileStorage() : m_readOnly(FALSE) {}
+ FileStorage( const QString &name) :
+ m_readOnly(FALSE) { m_file.setName(name); }
+ int read(char *buf,uint size) { return m_file.readBlock(buf,size); }
+ int write(const char *buf,uint size) { assert(m_readOnly==FALSE); return m_file.writeBlock(buf,size); }
+ bool open( int m ) { m_readOnly = m==IO_ReadOnly; return m_file.open(m); }
+ bool seek(int64 pos) { return m_file.seek(pos); }
+ int64 pos() const { return m_file.pos(); }
+ void close() { m_file.close(); }
+ void setName( const char *name ) { m_file.setName(name); }
+ private:
+ bool m_readOnly;
+ QFile m_file;
+};
+
+#if 0 // experimental version using mmap after opening the file as read only.
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <stdio.h>
+
+class FileStorage : public StorageIntf
+{
+ public:
+ FileStorage() : m_readOnly(FALSE), m_map(0), m_off(0), m_size(0) {}
+ FileStorage( const QString &name) :
+ m_readOnly(FALSE) { m_file.setName(name); }
+ void setName( const char *name ) { m_file.setName(name); }
+ bool open( int m )
+ {
+ if (m==IO_ReadOnly)
+ {
+ m_readOnly=TRUE;
+ QString name = m_file.name();
+ m_file.close();
+ m_fd = ::open(name.data(),O_RDONLY);
+ struct stat stat;
+ fstat(m_fd,&stat);
+ m_size = stat.st_size;
+ m_map = mmap(NULL,m_size,PROT_READ,MAP_SHARED,m_fd,0);
+ if (m_map==MAP_FAILED) perror("mmap failed");
+ assert(m_map!=MAP_FAILED);
+ m_off = 0;
+ return TRUE;
+ }
+ else
+ {
+ m_readOnly = FALSE;
+ return m_file.open(m);
+ }
+ }
+ int write(const char *buf,uint size)
+ {
+ assert(m_map==0);
+ return m_file.writeBlock(buf,size);
+ }
+ int read(char *buf,uint size)
+ {
+ assert(m_map!=0);
+ memcpy(buf,((char *)m_map)+m_off,size);
+ m_off+=size;
+ return size;
+ }
+ bool seek(int64 pos)
+ {
+ m_off=pos;
+ return TRUE;
+ }
+ int64 pos() const
+ {
+ if (m_readOnly)
+ {
+ return m_off;
+ }
+ else
+ {
+ return m_file.pos();
+ }
+ }
+ void close()
+ {
+ if (m_readOnly)
+ {
+ munmap(m_map,m_size);
+ ::close(m_fd);
+ exit(1);
+ }
+ else
+ {
+ m_file.close();
+ }
+ }
+ private:
+ bool m_readOnly;
+ QFile m_file;
+ int m_fd;
+ void *m_map;
+ off_t m_off;
+ off_t m_size;
+};
+#endif
+
+#endif
diff --git a/src/gifenc.cpp b/src/gifenc.cpp
deleted file mode 100644
index 501e433..0000000
--- a/src/gifenc.cpp
+++ /dev/null
@@ -1,287 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2009 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * All output generated with Doxygen is not covered by this license.
- *
- * The GIF compression code below is based on the file ppmtogif.c of the
- * netpbm package. The original copyright message follows:
- *
- * ---------------------------------------------------------------------------
- *
- * Copyright (C) 1989 by Jef Poskanzer.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation. This software is provided "as is" without express or
- * implied warranty.
- *
- * ---------------------------------------------------------------------------
- *
- * The Graphics Interchange Format(c) is the Copyright property of
- * CompuServe Incorporated. GIF(sm) is a Service Mark property of
- * CompuServe Incorporated.
- */
-
-#include "gifenc.h"
-
-static const unsigned int masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F,
- 0x001F, 0x003F, 0x007F, 0x00FF,
- 0x01FF, 0x03FF, 0x07FF, 0x0FFF,
- 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };
-
-GifEncoder::GifEncoder(Byte *rawBytes,Color *p,int w,int h, Byte d,
- int t)
- : colorResolution(8),globalPaletteFlag(0x80),bits(12),
- maxMaxCode(1<<bits)
-{
- width = w;
- height = h;
- depth = d;
- transIndex = t;
- palette = p;
- data = rawBytes;
- dataPtr = data;
-}
-
-GifEncoder::~GifEncoder()
-{
-}
-
-void GifEncoder::writeGIF(QFile &fp)
-{
- // Write the Magic header
- fp.writeBlock( transIndex < 0 ? "GIF87a" : "GIF89a", 6 );
-
- // Write the logical screen descriptor
- putWord( width, fp );
- putWord( height, fp );
- Byte pack = globalPaletteFlag | ((colorResolution-1)<<4) | (depth-1);
- putByte( pack, fp );
- putByte( 0, fp ); // the background color
- putByte( 0, fp ); // no aspect ration defined
-
- // Write global color table
- int i; for ( i=0 ; i< (1<<depth) ; i++)
- {
- putByte(palette[i].red, fp);
- putByte(palette[i].green,fp);
- putByte(palette[i].blue, fp);
- }
-
- if ( transIndex >= 0)
- {
- // Write graphic control extension (needed for GIF transparancy)
- putByte( 0x21, fp); // extension introducer
- putByte( 0xf9, fp); // graphic control label
- putByte( 4, fp); // block size
- putByte( 1, fp); // announce transparacy value
- putWord( 0, fp); // zero delay time
- putByte( transIndex, fp); // write transparant index
- putByte( 0, fp); // end block
- }
-
- // Write the image descriptor
- putByte( 0x2c, fp); // image separator
- putWord( 0, fp); // image left position
- putWord( 0, fp); // image top position
- putWord( width, fp); // image width
- putWord( height, fp); // image height
- putByte( 0, fp); // no local color table, no interlacing
-
- // Write table based image data
- Byte initCodeSize = depth<=1 ? 2 : depth;
- putByte( initCodeSize, fp); // LZW Minimum Code Size
- compress( initCodeSize+1, fp);
- putByte( 0, fp); // end of blocks
-
- // Write GIF Trailer
- putByte( 0x3b, fp);
-}
-
-void GifEncoder::compress( int ibits, QFile &outfile )
-{
- int i;
- int entry;
-
- initBits = ibits;
- numPixels = width*height;
- dataPtr = data;
- clearFlag = FALSE;
- nBits = initBits;
- maxCode = (1<<nBits) -1;
- ClearCode = (1 << (initBits - 1));
- EOFCode = ClearCode + 1;
- freeEntry = ClearCode + 2;
- aCount = 0;
- curAccum = 0;
- curBits = 0;
-
- entry = nextPixel();
-
- int hshift = 0;
- int fcode;
- for ( fcode = hashTableSize; fcode < 65536L; fcode *= 2L ) ++hshift;
- hshift = 8 - hshift; /* set hash code range bound */
-
- clearHashTable(); /* clear hash table */
-
- writeCode( ClearCode,outfile );
-
- int c;
- while ( (c = nextPixel()) != EOF )
- {
- fcode = (c << bits) + entry;
- i = (c << hshift) ^ entry; /* xor hashing */
-
- bool found=FALSE;
- if (htab[i]==fcode)
- {
- entry = codetab[i];
- found=TRUE;
- }
- else if (htab[i]>=0)
- {
- int disp = hashTableSize - i;
- if (i==0) disp=1;
- do
- {
- if ((i-=disp)<0) i+=hashTableSize;
- if (htab[i]==fcode)
- {
- entry=codetab[i];
- found=TRUE;
- }
- } while (htab[i]>0 && !found);
- }
- if (!found)
- {
- writeCode( entry, outfile );
- entry = c;
- if ( freeEntry < maxMaxCode )
- {
- codetab[i] = freeEntry++; /* code -> hashtable */
- htab[i] = fcode;
- }
- else
- {
- clearHashTable();
- freeEntry = ClearCode + 2;
- clearFlag = TRUE;
- writeCode( ClearCode, outfile );
- }
- }
- }
- writeCode( entry, outfile );
- writeCode( EOFCode, outfile );
-}
-
-void GifEncoder::putWord( Word w, QFile &fp )
-{
- fp.putch( w & 0xff );
- fp.putch( (w>>8) & 0xff );
-}
-
-void GifEncoder::putByte( Byte b, QFile &fp )
-{
- fp.putch( b );
-}
-
-void GifEncoder::writeCode( int code, QFile &outfile )
-{
- curAccum &= masks[ curBits ];
-
- if ( curBits > 0 )
- {
- curAccum |= (code << curBits);
- }
- else
- {
- curAccum = code;
- }
-
- curBits += nBits;
-
- while( curBits >= 8 )
- {
- writeChar( (Byte)(curAccum & 0xff),outfile );
- curAccum >>= 8;
- curBits -= 8;
- }
-
- /*
- * If the next entry is going to be too big for the code size,
- * then increase it, if possible.
- */
- if ( freeEntry > maxCode || clearFlag )
- {
- if( clearFlag )
- {
- nBits = initBits;
- maxCode = (1<<nBits)-1;
- clearFlag = FALSE;
- }
- else
- {
- ++nBits;
- if ( nBits == bits )
- maxCode = maxMaxCode;
- else
- maxCode = (1<<nBits)-1;
- }
- }
-
- if ( code == EOFCode )
- {
- /* At EOF, write the rest of the buffer. */
- while( curBits > 0 )
- {
- writeChar( (Byte)(curAccum & 0xff), outfile );
- curAccum >>= 8;
- curBits -= 8;
- }
-
- writePacket(outfile);
- }
-}
-
-/*
- * Add a character to the end of the current packet, and if it is 254
- * characters, flush the packet to disk.
- */
-void GifEncoder::writeChar( Byte c, QFile &fp )
-{
- accum[ aCount++ ] = c;
- if( aCount >= 254 ) writePacket(fp);
-}
-
-/*
- * Flush the packet to disk, and reset the accumulator
- */
-void GifEncoder::writePacket(QFile &fp)
-{
- if ( aCount > 0 )
- {
- fp.putch( aCount );
- fp.writeBlock( (const char *)accum, aCount );
- aCount = 0;
- }
-}
-
-void GifEncoder::clearHashTable() /* reset code table */
-{
- int *htab_p = htab;
- int i; for (i=0;i<hashTableSize;i++) *htab_p++ = -1;
-}
-
diff --git a/src/gifenc.h b/src/gifenc.h
deleted file mode 100644
index cca3283..0000000
--- a/src/gifenc.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2009 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * All output generated with Doxygen is not covered by this license.
- *
- */
-
-#ifndef _GIFENC_H
-#define _GIFENC_H
-#include <qfile.h>
-
-typedef unsigned char Byte;
-typedef unsigned short Word;
-
-struct Color
-{
- Byte red;
- Byte green;
- Byte blue;
-};
-
-const int hashTableSize=5003; // size of the hash table
-
-class GifEncoder
-{
- public:
- GifEncoder(Byte *rawBytes,Color *p,int w,int h,Byte d,int t);
- ~GifEncoder();
- void writeGIF(QFile &fp);
-
- protected:
- void putWord( Word w, QFile &fp );
- void putByte( Byte b, QFile &fp );
- void compress(int csize, QFile &fp);
- void writeCode(int code, QFile &fp);
- void writeChar( Byte c, QFile &fp );
- void writePacket(QFile &fp);
- void clearHashTable();
- int nextPixel()
- {
- if ( --numPixels < 0) return EOF;
- return *dataPtr++;
- }
-
-
- private:
- const int colorResolution; // 8 bit for Red, Green and Blue;
- const int globalPaletteFlag;
- const int bits;
- const int maxMaxCode;
-
- // image variables
- int width; // image width
- int height; // image height
- Byte depth; // bits per CLUT entry
- int transIndex; // index of the transparant color; -1 = none
- Color *palette; // pointer to the color palette
- int numPixels; // total number of pixel (i.e. width * height)
- Byte *data; // pointer to the image data (one byte per pixel)
- Byte *dataPtr; // pointer located at the current pixel.
-
- // compression variables
- bool clearFlag; // clear hash table flag
- int freeEntry; // first free entry in the hash table
- unsigned int curAccum; // encoded bit accumulator
- int curBits; // number of bits in curAccum
- Byte accum[256]; // Buffer for a packet
- int aCount; // Number of characters so far in this 'packet'
- int nBits; // number of bits/code
- int maxCode; // maximum code, given n_bits
- int initBits; // initial number of bits
- int EOFCode; // code for signaling the end of the file
- int ClearCode; // the clear code for the decompressor
-
- // tables
- int htab[hashTableSize]; // the hash table
- Word codetab[hashTableSize]; // the code table
-};
-
-#endif
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
index 1654733..c9ff1f0 100644
--- a/src/htmlgen.cpp
+++ b/src/htmlgen.cpp
@@ -1005,7 +1005,10 @@ static QCString substituteHtmlKeywords(const QCString &s,const char *title,
}
// first substitute generic keywords
- QCString result = substituteKeywords(s,title);
+ QCString result = substituteKeywords(s,title,
+ convertToHtml(Config_getString("PROJECT_NAME")),
+ convertToHtml(Config_getString("PROJECT_NUMBER")),
+ convertToHtml(Config_getString("PROJECT_BRIEF")));
// additional HTML only keywords
result = substitute(result,"$stylesheet",cssFile);
@@ -2452,6 +2455,7 @@ static bool quickLinkVisible(LayoutNavEntry::Kind kind)
switch (kind)
{
case LayoutNavEntry::MainPage: return TRUE;
+ case LayoutNavEntry::User: return TRUE;
case LayoutNavEntry::Pages: return indexedPages>0;
case LayoutNavEntry::Modules: return documentedGroups>0;
case LayoutNavEntry::Namespaces: return documentedNamespaces>0;
@@ -2485,8 +2489,12 @@ static void renderQuickLinksAsTree(FTextStream &t,const QCString &relPath,Layout
{
if (entry->visible() && quickLinkVisible(entry->kind()))
{
- startQuickIndexItem(t,entry->baseFile()+Doxygen::htmlFileExtension,
- FALSE,FALSE,relPath);
+ QCString url = entry->baseFile();
+ if (entry->kind()!=LayoutNavEntry::User)
+ {
+ url+=Doxygen::htmlFileExtension;
+ }
+ startQuickIndexItem(t,url,FALSE,FALSE,relPath);
t << fixSpaces(entry->title());
// recursive into child list
renderQuickLinksAsTree(t,relPath,entry);
@@ -2525,7 +2533,12 @@ static void renderQuickLinksAsTabs(FTextStream &t,const QCString &relPath,
{
if (entry->visible() && quickLinkVisible(entry->kind()))
{
- startQuickIndexItem(t,entry->baseFile()+Doxygen::htmlFileExtension,
+ QCString url = entry->baseFile();
+ if (entry->kind()!=LayoutNavEntry::User)
+ {
+ url+=Doxygen::htmlFileExtension;
+ }
+ startQuickIndexItem(t,url,
entry==hlEntry &&
(entry->children().count()>0 ||
(entry->kind()==kind && !highlightParent)
@@ -2694,9 +2707,6 @@ void HtmlGenerator::writeSearchPage()
static bool generateTreeView = Config_getBool("GENERATE_TREEVIEW");
static bool disableIndex = Config_getBool("DISABLE_INDEX");
static QCString projectName = Config_getString("PROJECT_NAME");
- static QCString projectBrief = Config_getString("PROJECT_BRIEF");
- static QCString projectNumber = Config_getString("PROJECT_NUMBER");
- static QCString projectLogo = Config_getString("PROJECT_LOGO");
// OPENSEARCH_PROVIDER {
QCString configFileName = Config_getString("HTML_OUTPUT")+"/search-config.php";
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
index 8500d10..d28f5e0 100644
--- a/src/latexgen.cpp
+++ b/src/latexgen.cpp
@@ -956,7 +956,10 @@ void LatexGenerator::startIndexSection(IndexSections is)
else
{
QCString header = fileToString(latexHeader);
- t << substituteKeywords(header,0);
+ t << substituteKeywords(header,0,
+ Config_getString("PROJECT_NAME"),
+ Config_getString("PROJECT_NUMBER"),
+ Config_getString("PROJECT_BRIEF"));
}
}
break;
@@ -1351,7 +1354,10 @@ void LatexGenerator::endIndexSection(IndexSections is)
else
{
QCString footer = fileToString(latexFooter);
- t << substituteKeywords(footer,0);
+ t << substituteKeywords(footer,0,
+ Config_getString("PROJECT_NAME"),
+ Config_getString("PROJECT_NUMBER"),
+ Config_getString("PROJECT_BRIEF"));
}
break;
}
diff --git a/src/layout.cpp b/src/layout.cpp
index 0209036..011141b 100644
--- a/src/layout.cpp
+++ b/src/layout.cpp
@@ -895,6 +895,13 @@ class LayoutParser : public QXmlDefaultHandler
theTranslator->trExamplesDescription(),
"examples"
},
+ { "user",
+ LayoutNavEntry::User,
+ QCString(),
+ QCString(),
+ QCString(),
+ "user"
+ },
{ 0, // end of list
(LayoutNavEntry::Kind)0,
QCString(),
@@ -945,6 +952,11 @@ class LayoutParser : public QXmlDefaultHandler
{
intro = mapping[i].intro;
}
+ QCString url = convertToQCString(attrib.value("url"));
+ if (mapping[i].kind==LayoutNavEntry::User && !url.isEmpty())
+ {
+ baseFile=url;
+ }
// create new item and make it the new root
m_rootNav = new LayoutNavEntry(m_rootNav,kind,kind==LayoutNavEntry::MainPage?TRUE:isVisible,baseFile,title,intro);
}
diff --git a/src/layout.h b/src/layout.h
index b9cf85b..47ba5f3 100644
--- a/src/layout.h
+++ b/src/layout.h
@@ -123,7 +123,8 @@ struct LayoutNavEntry
Files,
FileGlobals,
Dirs,
- Examples
+ Examples,
+ User
};
LayoutNavEntry(LayoutNavEntry *parent,Kind k,bool vs,const QCString &bf,
const QCString &tl,const QCString &intro,bool prepend=FALSE)
diff --git a/src/marshal.cpp b/src/marshal.cpp
index 8f2e879..0675277 100644
--- a/src/marshal.cpp
+++ b/src/marshal.cpp
@@ -644,9 +644,9 @@ MemberSDict *unmarshalMemberSDict(StorageIntf *s)
//printf(" unmarshaling key %s\n",key.data());
MemberDef *md = (MemberDef *)unmarshalObjPointer(s);
//printf(" unmarshalMemberSDict i=%d key=%s md=%p\n",i,key.data(),md);
- result->append(key,md); // note: this can lead to unmarshalling another object!
+ result->append(key,md);
}
- result->sort();
+
//printf("--- end unmarshalMemberSDict\n");
return result;
}
diff --git a/src/marshal.h b/src/marshal.h
index a30c431..ad25b5d 100644
--- a/src/marshal.h
+++ b/src/marshal.h
@@ -1,3 +1,18 @@
+/******************************************************************************
+ *
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation under the terms of the GNU General Public License is hereby
+ * granted. No representations are made about the suitability of this software
+ * for any purpose. It is provided "as is" without express or implied warranty.
+ * See the GNU General Public License for more details.
+ *
+ * Documents produced by Doxygen are derivative works derived from the
+ * input used in their production; they are not affected by this license.
+ *
+ */
+
#ifndef MARSHAL_H
#define MARSHAL_H
@@ -25,58 +40,6 @@ class Entry;
#define NULL_LIST 0xffffffff
-class FileStorage : public QFile, public StorageIntf
-{
- public:
- FileStorage() : QFile() {}
- FileStorage( const QString &name) : QFile(name) {}
- int read(char *buf,uint size) { return QFile::readBlock(buf,size); }
- int write(const char *buf,uint size) { return QFile::writeBlock(buf,size); }
-};
-
-class StreamStorage : public StorageIntf
-{
- public:
- StreamStorage()
- {
- m_data=0;
- m_offset=0;
- m_len=0;
- }
- ~StreamStorage()
- {
- delete m_data;
- }
- StreamStorage(char *data,uint len)
- {
- m_data=data;
- m_offset=0;
- m_len=len;
- }
- int read(char *buf,uint size)
- {
- int bytesLeft = QMIN((int)size,m_len-m_offset);
- if (bytesLeft>0) memcpy(buf,m_data,bytesLeft);
- m_offset+=bytesLeft;
- return bytesLeft;
- }
- int write(const char *buf,uint size)
- {
- m_data=(char *)realloc(m_data,m_offset+size);
- memcpy(m_data+m_offset,buf,size);
- m_offset+=size;
- m_len+=size;
- return size;
- }
- void rewind() { m_offset=0; }
- char *data() const { return m_data; }
- int size() { return m_len; }
- private:
- char *m_data;
- int m_offset;
- int m_len;
-};
-
//----- marshaling function: datatype -> byte stream --------------------
void marshalInt(StorageIntf *s,int v);
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index 9b24ed9..b61e9d9 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -49,6 +49,10 @@
#define snprintf _snprintf
#endif
+// Put this macro at the start of any method of MemberDef that can directly
+// or indirectly access other MemberDefs. It prevents that the content
+// pointed to by m_impl gets flushed to disk in the middle of the method call!
+#define KEEP_RESIDENT_DURING_CALL makeResident();LockingPtr<MemberDef> lock(this,this)
//-----------------------------------------------------------------------------
@@ -693,6 +697,8 @@ void MemberDef::moveTo(Definition *scope)
MemberDef::~MemberDef()
{
delete m_impl;
+ //printf("%p: ~MemberDef()\n",this);
+ m_impl=0;
if (m_cacheHandle!=-1)
{
Doxygen::symbolCache->del(m_cacheHandle);
@@ -858,7 +864,7 @@ QCString MemberDef::getReference() const
QCString MemberDef::anchor() const
{
- makeResident();
+ KEEP_RESIDENT_DURING_CALL;
QCString result=m_impl->anc;
if (m_impl->groupAlias) return m_impl->groupAlias->anchor();
if (m_impl->templateMaster) return m_impl->templateMaster->anchor();
@@ -882,7 +888,7 @@ QCString MemberDef::anchor() const
void MemberDef::_computeLinkableInProject()
{
- makeResident();
+ KEEP_RESIDENT_DURING_CALL;
static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
static bool extractStatic = Config_getBool("EXTRACT_STATIC");
m_isLinkableCached = 2; // linkable
@@ -1018,11 +1024,10 @@ void MemberDef::setDefinitionTemplateParameterLists(QList<ArgumentList> *lists)
void MemberDef::writeLink(OutputList &ol,ClassDef *,NamespaceDef *,
FileDef *fd,GroupDef *gd,bool onlyText)
{
+ KEEP_RESIDENT_DURING_CALL;
+ SrcLangExt lang = getLanguage();
//static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
static bool hideScopeNames = Config_getBool("HIDE_SCOPE_NAMES");
- makeResident();
- SrcLangExt lang = getLanguage();
- LockingPtr<MemberDef> lock(this,this);
QCString sep = getLanguageSpecificSeparator(lang);
QCString n = name();
if (!hideScopeNames)
@@ -1069,9 +1074,12 @@ void MemberDef::writeLink(OutputList &ol,ClassDef *,NamespaceDef *,
*/
ClassDef *MemberDef::getClassDefOfAnonymousType()
{
+ // split KEEP_RESIDENT_DURING_CALL for performance
makeResident();
if (m_impl->cachedAnonymousType) return m_impl->cachedAnonymousType;
- LockingPtr<MemberDef> lock(this,this);
+ LockingPtr<MemberDef> lock(this,this); // since this memberDef can access
+ // other memberDefs prevent it from
+ // being flushed to disk halfway
QCString cname;
if (getClassDef()!=0)
@@ -1139,8 +1147,8 @@ bool MemberDef::isBriefSectionVisible() const
// "", //getFileDef()->name().data(),
// argsString());
- makeResident();
- LockingPtr<MemberDef> lock(this,this);
+ KEEP_RESIDENT_DURING_CALL;
+
MemberGroupInfo *info = Doxygen::memGrpInfoDict[m_impl->grpId];
//printf("name=%s m_impl->grpId=%d info=%p\n",name().data(),m_impl->grpId,info);
//QCString *pMemGrp = Doxygen::memberDocDict[grpId];
@@ -1232,9 +1240,8 @@ void MemberDef::writeDeclaration(OutputList &ol,
// hide enum value, since they appear already as part of the enum, unless they
// are explicitly grouped.
- makeResident();
+ KEEP_RESIDENT_DURING_CALL;
if (!inGroup && m_impl->mtype==EnumValue) return;
- LockingPtr<MemberDef> lock(this,this);
// hide members whose brief section should not be visible
//if (!isBriefSectionVisible()) return;
@@ -1680,7 +1687,8 @@ bool MemberDef::isDetailedSectionLinkable() const
static bool extractStatic = Config_getBool("EXTRACT_STATIC");
static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
- makeResident();
+ KEEP_RESIDENT_DURING_CALL;
+
// the member has details documentation for any of the following reasons
bool docFilter =
// treat everything as documented
@@ -1775,10 +1783,10 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
if ( !hasDocs ) return;
if (isEnumValue() && !showEnumValues) return;
- makeResident();
+ KEEP_RESIDENT_DURING_CALL;
+
SrcLangExt lang = getLanguage();
bool optVhdl = lang==SrcLangExt_VHDL;
- LockingPtr<MemberDef> lock(this,this);
QCString scopeName = scName;
QCString memAnchor = anchor();
@@ -2532,6 +2540,8 @@ static QCString simplifyTypeForTable(const QCString &s)
void MemberDef::writeMemberDocSimple(OutputList &ol, Definition *container)
{
+ KEEP_RESIDENT_DURING_CALL;
+
Definition *scope = getOuterScope();
QCString doxyName = name();
QCString doxyArgs = argsString();
@@ -2818,8 +2828,7 @@ void MemberDef::setNamespace(NamespaceDef *nd)
MemberDef *MemberDef::createTemplateInstanceMember(
ArgumentList *formalArgs,ArgumentList *actualArgs)
{
- makeResident();
- LockingPtr<MemberDef> lock(this,this);
+ KEEP_RESIDENT_DURING_CALL;
//printf(" Member %s %s %s\n",typeString(),name().data(),argsString());
ArgumentList *actualArgList = 0;
if (m_impl->defArgList)
@@ -2896,7 +2905,7 @@ void MemberDef::setInitializer(const char *initializer)
void MemberDef::addListReference(Definition *)
{
- makeResident();
+ KEEP_RESIDENT_DURING_CALL;
static bool optimizeOutputForC = Config_getBool("OPTIMIZE_OUTPUT_FOR_C");
//static bool hideScopeNames = Config_getBool("HIDE_SCOPE_NAMES");
//static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
@@ -2978,6 +2987,7 @@ void MemberDef::setSectionList(Definition *d, MemberList *sl)
Specifier MemberDef::virtualness(int count) const
{
+ KEEP_RESIDENT_DURING_CALL;
if (count>25)
{
warn(getDefFileName(),getDefLine(),
@@ -2999,7 +3009,7 @@ Specifier MemberDef::virtualness(int count) const
void MemberDef::_computeIsConstructor()
{
- makeResident();
+ KEEP_RESIDENT_DURING_CALL;
m_isConstructorCached=1; // FALSE
if (m_impl->classDef)
{
@@ -3055,7 +3065,7 @@ bool MemberDef::isConstructor() const
void MemberDef::_computeIsDestructor()
{
- makeResident();
+ KEEP_RESIDENT_DURING_CALL;
bool isDestructor;
if (m_impl->isDMember) // for D
{
@@ -3097,8 +3107,8 @@ bool MemberDef::isDestructor() const
void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd)
{
- makeResident();
- LockingPtr<MemberDef> lock(this,this);
+ KEEP_RESIDENT_DURING_CALL;
+
int enumMemCount=0;
QList<MemberDef> *fmdl=m_impl->enumFields;
@@ -3752,26 +3762,6 @@ bool MemberDef::hasDocumentedReturnType() const
return m_impl->hasDocumentedReturnType;
}
-#if 0
-int MemberDef::inbodyLine() const
-{
- makeResident();
- return m_impl->inbodyLine;
-}
-
-QCString MemberDef::inbodyFile() const
-{
- makeResident();
- return m_impl->inbodyFile;
-}
-
-const QCString &MemberDef::inbodyDocumentation() const
-{
- makeResident();
- return m_impl->inbodyDocs;
-}
-#endif
-
ClassDef *MemberDef::relatedAlso() const
{
makeResident();
@@ -4175,12 +4165,66 @@ void MemberDef::cacheTypedefVal(ClassDef*val, const QCString & templSpec, const
//printf("MemberDef::cacheTypedefVal=%s m_impl=%p\n",m_impl->cachedResolvedType.data(),m_impl);
}
+void MemberDef::copyArgumentNames(MemberDef *bmd)
+{
+ makeResident();
+ {
+ LockingPtr<ArgumentList> arguments = bmd->argumentList();
+ if (m_impl->defArgList && arguments!=0)
+ {
+ ArgumentListIterator aliDst(*m_impl->defArgList);
+ ArgumentListIterator aliSrc(*arguments);
+ Argument *argDst, *argSrc;
+ for (;(argDst=aliDst.current()) && (argSrc=aliSrc.current());++aliDst,++aliSrc)
+ {
+ argDst->name = argSrc->name;
+ }
+ }
+ }
+ {
+ LockingPtr<ArgumentList> arguments = bmd->declArgumentList();
+ if (m_impl->declArgList && arguments!=0)
+ {
+ ArgumentListIterator aliDst(*m_impl->declArgList);
+ ArgumentListIterator aliSrc(*arguments);
+ Argument *argDst, *argSrc;
+ for (;(argDst=aliDst.current()) && (argSrc=aliSrc.current());++aliDst,++aliSrc)
+ {
+ argDst->name = argSrc->name;
+ }
+ }
+ }
+}
+
+static void invalidateCachedTypesInArgumentList(ArgumentList *al)
+{
+ if (al)
+ {
+ ArgumentListIterator ali(*al);
+ Argument *a;
+ for (ali.toFirst();(a=ali.current());++ali)
+ {
+ a->canType.resize(0);
+ }
+ }
+}
+
+void MemberDef::invalidateCachedArgumentTypes()
+{
+ makeResident();
+ invalidateCachedTypesInArgumentList(m_impl->defArgList);
+ invalidateCachedTypesInArgumentList(m_impl->declArgList);
+}
+
+
+//-----------------------------------------------------------------
+
void MemberDef::flushToDisk() const
{
if (isLocked()) return;
MemberDef *that = (MemberDef*)this;
that->m_storagePos = Doxygen::symbolStorage->alloc();
- //printf("%p: MemberDef::flushToDisk()\n",this);
+ //printf("%p: MemberDef::flushToDisk() m_impl=%p\n",this,m_impl);
// write the definition base class member variables to disk
Definition::flushToDisk();
@@ -4268,10 +4312,10 @@ void MemberDef::flushToDisk() const
void MemberDef::loadFromDisk() const
{
- //printf("%p: MemberDef::loadFromDisk()\n",this);
MemberDef *that = (MemberDef *)this;
if (isLocked())
{
+ //printf("%p: loadFromDisk() locked: so still in memory\n",this);
assert(m_impl!=0);
return;
}
@@ -4283,6 +4327,7 @@ void MemberDef::loadFromDisk() const
//printf("%p: loading specific part\n",this);
that->m_impl = new MemberDefImpl;
+ //printf("%p: MemberDef::loadFromDisk(): m_impl=%p\n",this,m_impl);
uint marker = unmarshalUInt(Doxygen::symbolStorage);
assert(marker==START_MARKER);
@@ -4358,6 +4403,8 @@ void MemberDef::loadFromDisk() const
m_impl->category = (ClassDef*)unmarshalObjPointer (Doxygen::symbolStorage);
marker = unmarshalUInt(Doxygen::symbolStorage);
assert(marker==END_MARKER);
+
+ //printf("%p: MemberDef::loadFromDisk(): sorting\n",this);
}
void MemberDef::makeResident() const
@@ -4371,6 +4418,7 @@ void MemberDef::makeResident() const
//printf("adding %s to cache, handle=%d\n",m_impl->name.data(),that->m_cacheHandle);
if (victim) // cache was full, victim was the least recently used item and has to go
{
+ //printf("%p: makeResident(): cache full %p::saveToDisk(): m_impl=%p\n",this,victim,victim->m_impl);
victim->m_cacheHandle=-1; // invalidate cache handle
victim->saveToDisk(); // store the item on disk
}
@@ -4404,6 +4452,7 @@ void MemberDef::saveToDisk() const
{
assert(m_impl!=0);
MemberDef *that = (MemberDef *)this;
+ //printf("%p: saveToDisk(): m_impl=%p\n",this,m_impl);
if (isLocked()) // cannot flush the item as it is locked
{
that->m_flushPending=TRUE; // flush when unlocked
@@ -4433,6 +4482,7 @@ void MemberDef::unlock() const
{
if (m_flushPending && !isLocked())
{
+ //printf("%p: flush after unlock\n",this);
// write a the new (possibly modified) instance to disk
flushToDisk();
// end to write sequence (unless nothing was written due to the lock)
@@ -4440,55 +4490,3 @@ void MemberDef::unlock() const
}
}
-void MemberDef::copyArgumentNames(MemberDef *bmd)
-{
- makeResident();
- {
- LockingPtr<ArgumentList> arguments = bmd->argumentList();
- if (m_impl->defArgList && arguments!=0)
- {
- ArgumentListIterator aliDst(*m_impl->defArgList);
- ArgumentListIterator aliSrc(*arguments);
- Argument *argDst, *argSrc;
- for (;(argDst=aliDst.current()) && (argSrc=aliSrc.current());++aliDst,++aliSrc)
- {
- argDst->name = argSrc->name;
- }
- }
- }
- {
- LockingPtr<ArgumentList> arguments = bmd->declArgumentList();
- if (m_impl->declArgList && arguments!=0)
- {
- ArgumentListIterator aliDst(*m_impl->declArgList);
- ArgumentListIterator aliSrc(*arguments);
- Argument *argDst, *argSrc;
- for (;(argDst=aliDst.current()) && (argSrc=aliSrc.current());++aliDst,++aliSrc)
- {
- argDst->name = argSrc->name;
- }
- }
- }
-}
-
-static void invalidateCachedTypesInArgumentList(ArgumentList *al)
-{
- if (al)
- {
- ArgumentListIterator ali(*al);
- Argument *a;
- for (ali.toFirst();(a=ali.current());++ali)
- {
- a->canType.resize(0);
- }
- }
-}
-
-void MemberDef::invalidateCachedArgumentTypes()
-{
- makeResident();
- invalidateCachedTypesInArgumentList(m_impl->defArgList);
- invalidateCachedTypesInArgumentList(m_impl->declArgList);
-}
-
-
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
index 4949f23..3cca845 100644
--- a/src/memberlist.cpp
+++ b/src/memberlist.cpp
@@ -808,10 +808,22 @@ void MemberList::setNeedsSorting(bool b)
int MemberSDict::compareItems(GCI item1, GCI item2)
{
+ // NOTE: this function can be triggered from unmarshalMemberSDict
+ // so it may not result in called to MemberDef::makeResident().
+ // As a result, the data returned by MemberDef::name() and
+ // MemberDef::getDefLine() will always be kept in memory.
MemberDef *c1=(MemberDef *)item1;
MemberDef *c2=(MemberDef *)item2;
+ //printf("MemberSDict::compareItems(%s,%s)\n",c1->name().data(),c2->name().data());
int cmp = stricmp(c1->name(),c2->name());
- return cmp!=0 ? cmp : c1->getDefLine()-c2->getDefLine();
+ if (cmp)
+ {
+ return cmp;
+ }
+ else
+ {
+ return c1->getDefLine()-c2->getDefLine();
+ }
}
diff --git a/src/store.cpp b/src/store.cpp
index 4b66b6b..b075218 100644
--- a/src/store.cpp
+++ b/src/store.cpp
@@ -25,6 +25,7 @@
#include <errno.h>
#include <string.h>
#include <assert.h>
+#include <ctype.h>
#define BLOCK_SIZE 512 // should be >8 and a power of 2
#define BLOCK_POINTER_SIZE sizeof(portable_off_t)
@@ -111,7 +112,7 @@ portable_off_t Store::alloc()
portable_off_t pos;
if (m_head==0) // allocate new block
{
- //printf("alloc: new block\n");
+ //printf("alloc: new block, pos=%lld\n",(long long)m_front);
if (portable_fseek(m_file,0,SEEK_END)==-1) // go to end of the file
{
fprintf(stderr,"Store::alloc: Error seeking to end of file: %s\n",strerror(errno));
@@ -130,7 +131,7 @@ portable_off_t Store::alloc()
}
else // reuse freed block
{
- //printf("alloc: reuse block: m_head=%d\n",(int)m_head);
+ //printf("alloc: reuse block: pos=%lld\n",(long long)m_head->pos);
Node *node = m_head;
pos = node->pos;
// point head to next free item
@@ -268,7 +269,7 @@ void Store::end()
void Store::release(portable_off_t pos)
{
STORE_ASSERT(m_state==Reading);
- //printf("%x: Store::release\n",(int)pos);
+ //printf("release: block pos=%lld\n",(long long)pos);
STORE_ASSERT(pos>0 && (pos & (BLOCK_SIZE-1))==0);
// goto end of the block
portable_off_t cur = pos, next;
@@ -396,6 +397,30 @@ void Store::printStats()
BLOCK_SIZE,(long)(m_front/BLOCK_SIZE),m_reads,m_writes);
}
+void Store::dumpBlock(portable_off_t s,portable_off_t e)
+{
+ portable_fseek(m_file,s,SEEK_SET);
+ int size = (int)(e-s);
+ uchar *buf = new uchar[size];
+ fread(buf,size,1,m_file);
+ int i,j;
+ for (i=0;i<size;i+=16)
+ {
+ printf("%08x: ",(int)s+i);
+ for (j=i;j<QMIN(size,i+16);j++)
+ {
+ printf("%02x ",buf[i+j]);
+ }
+ printf(" ");
+ for (j=i;j<QMIN(size,i+16);j++)
+ {
+ printf("%c",(buf[i+j]>=32 && buf[i+j]<128)?buf[i+j]:'.');
+ }
+ printf("\n");
+ }
+ portable_fseek(m_file,m_cur,SEEK_SET);
+}
+
#ifdef STORE_TEST
int main()
diff --git a/src/store.h b/src/store.h
index df23e96..6d6eee8 100644
--- a/src/store.h
+++ b/src/store.h
@@ -94,6 +94,10 @@ class Store : public StorageIntf
void printStats();
+ portable_off_t pos() const { return m_cur; }
+
+ void dumpBlock(portable_off_t start,portable_off_t end);
+
private:
enum State
{
diff --git a/src/tclscanner.h b/src/tclscanner.h
index e080d6c..b586450 100644
--- a/src/tclscanner.h
+++ b/src/tclscanner.h
@@ -2,8 +2,8 @@
*
*
*
- * Copyright (C) 1997-2010 by Dimitri van Heesch.
- * Copyright (C) 2010 by Rene Zaumseil
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
+ * Copyright (C) 2010-2011 by Rene Zaumseil
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/translator_fa.h b/src/translator_fa.h
index 6459d8d..e385d79 100644
--- a/src/translator_fa.h
+++ b/src/translator_fa.h
@@ -50,10 +50,10 @@ class TranslatorPersian : public TranslatorAdapter_1_7_5
const char * PersianDigits[] = { "Û°", "Û±", "Û²", "Û³", "Û´", "Ûµ", "Û¶", "Û·", "Û¸", "Û¹" };
for(unsigned i=0; i<str.length(); i++)
{
- if (str[i] >= '0' && str[i] <= '9')
- output += PersianDigits[ str[i] - '0' ];
+ if (str.at(i) >= '0' && str.at(i) <= '9')
+ output += PersianDigits[ str.at(i) - '0' ];
else
- output += str[i];
+ output += str.at(i);
}
return output;
diff --git a/src/translator_fr.h b/src/translator_fr.h
index bbcca74..373c364 100644
--- a/src/translator_fr.h
+++ b/src/translator_fr.h
@@ -76,6 +76,7 @@
* | Corrected some misspelling thanx to Christophe C.
* -------------+------------------------------------------------------------
*/
+
#ifndef TRANSLATOR_FR_H
#define TRANSLATOR_FR_H
@@ -100,7 +101,7 @@
// Translator class (by the local maintainer) when the localized
// translator is made up-to-date again.
-class TranslatorFrench : public TranslatorAdapter_1_6_3
+class TranslatorFrench : public Translator
{
public:
@@ -113,8 +114,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
* the identification used in language.cpp.
*/
virtual QCString idLanguage()
- {
- return "french"; }
+ { return "french"; }
/*! Used to get the LaTeX command(s) for the language support.
* This method should return string with commands that switch
@@ -132,7 +132,8 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
return "\\usepackage[french]{babel}\n";
}
- /*! return the language charset. This will be used for the HTML output */
+ /*! return the language charset. This will be used
+ when transcoding the translatable strings in this file to UTF-8 */
virtual QCString idLanguageCharset()
{
return "iso-8859-1";
@@ -142,33 +143,27 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! used in the compound documentation before a list of related functions. */
virtual QCString trRelatedFunctions()
- {
- return "Fonctions associées"; }
+ { return "Fonctions associées"; }
/*! subscript for the related functions. */
virtual QCString trRelatedSubscript()
- {
- return "(Noter que ce ne sont pas des fonctions membres)"; }
+ { return "(Notez que ce ne sont pas des fonctions membres)"; }
/*! header that is put before the detailed description of files, classes and namespaces. */
virtual QCString trDetailedDescription()
- {
- return "Description détaillée"; }
+ { return "Description détaillée"; }
/*! header that is put before the list of typedefs. */
virtual QCString trMemberTypedefDocumentation()
- {
- return "Documentation des définitions de type membres"; }
+ { return "Documentation des définitions de type membres"; }
/*! header that is put before the list of enumerations. */
virtual QCString trMemberEnumerationDocumentation()
- {
- return "Documentation des énumérations membres"; }
+ { return "Documentation des énumérations membres"; }
/*! header that is put before the list of member functions. */
virtual QCString trMemberFunctionDocumentation()
- {
- return "Documentation des fonctions membres"; }
+ { return "Documentation des fonctions membres"; }
/*! header that is put before the list of member attributes. */
virtual QCString trMemberDataDocumentation()
@@ -185,28 +180,23 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! this is the text of a link put after brief descriptions. */
virtual QCString trMore()
- {
- return "Plus de détails..."; }
+ { return "Plus de détails..."; }
/*! put in the class documentation */
virtual QCString trListOfAllMembers()
- {
- return "Liste de tous les membres"; }
+ { return "Liste de tous les membres"; }
/*! used as the title of the "list of all members" page of a class */
virtual QCString trMemberList()
- {
- return "Liste des membres"; }
+ { return "Liste des membres"; }
/*! this is the first part of a sentence that is followed by a class name */
virtual QCString trThisIsTheListOfAllMembers()
- {
- return "Liste complète des membres de "; }
+ { return "Liste complète des membres de "; }
/*! this is the remainder of the sentence after the class name */
virtual QCString trIncludingInheritedMembers()
- {
- return ", y compris les membres hérités :"; }
+ { return ", y compris les membres hérités :"; }
/*! this is put at the author sections at the bottom of man pages.
* parameter s is name of the project name.
@@ -220,18 +210,15 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! put after an enum name in the list of all members */
virtual QCString trEnumName()
- {
- return "énumération"; }
+ { return "énumération"; }
/*! put after an enum value in the list of all members */
virtual QCString trEnumValue()
- {
- return "valeur énumérée"; }
+ { return "valeur énumérée"; }
/*! put after an undocumented member in the list of all members */
virtual QCString trDefinedIn()
- {
- return "défini dans"; }
+ { return "défini dans"; }
// quick reference sections
@@ -239,13 +226,11 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
* compounds or files (see the \\group command).
*/
virtual QCString trModules()
- {
- return "Modules"; }
+ { return "Modules"; }
/*! This is put above each page as a link to the class hierarchy */
virtual QCString trClassHierarchy()
- {
- return "Hiérarchie des classes"; }
+ { return "Hiérarchie des classes"; }
/*! This is put above each page as a link to the list of annotated classes */
virtual QCString trCompoundList()
@@ -262,8 +247,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! This is put above each page as a link to the list of documented files */
virtual QCString trFileList()
- {
- return "Liste des fichiers"; }
+ { return "Liste des fichiers"; }
/*! This is put above each page as a link to all members of compounds. */
virtual QCString trCompoundMembers()
@@ -283,7 +267,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- return "Portée globale";
+ return "Variables globale";
}
else
{
@@ -293,23 +277,19 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! This is put above each page as a link to all related pages. */
virtual QCString trRelatedPages()
- {
- return "Pages associées"; }
+ { return "Pages associées"; }
/*! This is put above each page as a link to all examples. */
virtual QCString trExamples()
- {
- return "Exemples"; }
+ { return "Exemples"; }
/*! This is put above each page as a link to the search engine. */
virtual QCString trSearch()
- {
- return "Recherche"; }
+ { return "Recherche"; }
/*! This is an introduction to the class hierarchy. */
virtual QCString trClassHierarchyDescription()
- {
- return "Cette liste d'héritage est classée "
+ { return "Cette liste d'héritage est classée "
"approximativement par ordre alphabétique :";
}
@@ -353,7 +333,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
{
result+="documentés ";
}
- result+="avec liens vers ";
+ result+="avec des liens vers ";
if (!extractAll)
{
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
@@ -386,14 +366,14 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
{
- result+="des fonctions, variables, macros, enumérations, et définitions de type ";
+ result+="de toutes les fonctions, variables, macros, enumérations, et définitions de type ";
}
else
{
result+="de tous les membres de fichier ";
}
if (!extractAll) result+="documentés ";
- result+="avec liens vers ";
+ result+="avec des liens vers ";
if (extractAll)
result+="les fichiers auxquels ils appartiennent :";
else
@@ -403,37 +383,31 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! This is an introduction to the page with the list of all examples */
virtual QCString trExamplesDescription()
- {
- return "Liste de tous les exemples :"; }
+ { return "Liste de tous les exemples :"; }
/*! This is an introduction to the page with the list of related pages */
virtual QCString trRelatedPagesDescription()
- {
- return "Liste de toutes les pages de documentation associées :"; }
+ { return "Liste de toutes les pages de documentation associées :"; }
/*! This is an introduction to the page with the list of class/file groups */
virtual QCString trModulesDescription()
- {
- return "Liste de tous les modules :"; }
+ { return "Liste de tous les modules :"; }
/*! This is used in HTML as the title of index.html. */
virtual QCString trDocumentation()
- {
- return "Documentation"; }
+ { return "Documentation"; }
/*! This is used in LaTeX as the title of the chapter with the
* index of all groups.
*/
virtual QCString trModuleIndex()
- {
- return "Index des modules"; }
+ { return "Index des modules"; }
/*! This is used in LaTeX as the title of the chapter with the
* class hierarchy.
*/
virtual QCString trHierarchicalIndex()
- {
- return "Index hiérarchique"; }
+ { return "Index hiérarchique"; }
/*! This is used in LaTeX as the title of the chapter with the
* annotated compound index.
@@ -454,15 +428,13 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
* list of all files.
*/
virtual QCString trFileIndex()
- {
- return "Index des fichiers"; }
+ { return "Index des fichiers"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all groups.
*/
virtual QCString trModuleDocumentation()
- {
- return "Documentation des modules"; }
+ { return "Documentation des modules"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all classes, structs and unions.
@@ -483,97 +455,83 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
* the documentation of all files.
*/
virtual QCString trFileDocumentation()
- {
- return "Documentation des fichiers"; }
+ { return "Documentation des fichiers"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all examples.
*/
virtual QCString trExampleDocumentation()
- {
- return "Documentation des exemples"; }
+ { return "Documentation des exemples"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all related pages.
*/
virtual QCString trPageDocumentation()
- {
- return "Documentation des pages associées"; }
+ { return "Documentation des pages associées"; }
/*! This is used in LaTeX as the title of the document */
virtual QCString trReferenceManual()
- {
- return "Manuel de référence"; }
+ { return "Manuel de référence"; }
/*! This is used in the documentation of a file as a header before the
* list of defines
*/
virtual QCString trDefines()
- {
- return "Macros"; }
+ { return "Macros"; }
/*! This is used in the documentation of a file as a header before the
* list of function prototypes
*/
virtual QCString trFuncProtos()
- {
- return "Prototypes de fonction"; }
+ { return "Prototypes de fonction"; }
/*! This is used in the documentation of a file as a header before the
* list of typedefs
*/
virtual QCString trTypedefs()
- {
- return "Définition de type"; }
+ { return "Définitions de type"; }
/*! This is used in the documentation of a file as a header before the
* list of enumerations
*/
virtual QCString trEnumerations()
- {
- return "Énumérations"; }
+ { return "Énumérations"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) functions
*/
virtual QCString trFunctions()
- {
- return "Fonctions"; }
+ { return "Fonctions"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
virtual QCString trVariables()
- {
- return "Variables"; }
+ { return "Variables"; }
/*! This is used in the documentation of a file as a header before the
* list of (global) variables
*/
virtual QCString trEnumerationValues()
- {
- return "Valeurs énumérées"; }
+ { return "Valeurs énumérées"; }
/*! This is used in the documentation of a file before the list of
* documentation blocks for defines
*/
virtual QCString trDefineDocumentation()
- {
- return "Documentation des macros"; }
+ { return "Documentation des macros"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for function prototypes
*/
virtual QCString trFunctionPrototypeDocumentation()
- {
- return "Documentation des prototypes de fonction"; }
+ { return "Documentation des prototypes de fonction"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for typedefs
*/
virtual QCString trTypedefDocumentation()
- {
- return "Documentation des définitions de type"; }
+ { return "Documentation des définitions de type"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for enumeration types
@@ -585,15 +543,13 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
* of documentation blocks for functions
*/
virtual QCString trFunctionDocumentation()
- {
- return "Documentation des fonctions"; }
+ { return "Documentation des fonctions"; }
/*! This is used in the documentation of a file/namespace before the list
* of documentation blocks for variables
*/
virtual QCString trVariableDocumentation()
- {
- return "Documentation des variables"; }
+ { return "Documentation des variables"; }
/*! This is used in the documentation of a file/namespace/group before
* the list of links to documented compounds
@@ -635,48 +591,39 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! this text is generated when the \\internal command is used. */
virtual QCString trForInternalUseOnly()
- {
- return "À usage interne uniquement."; }
+ { return "Pour un usage interne uniquement."; }
/*! this text is generated when the \\warning command is used. */
virtual QCString trWarning()
- {
- return "Avertissement"; }
+ { return "Avertissement"; }
/*! this text is generated when the \\version command is used. */
virtual QCString trVersion()
- {
- return "Version"; }
+ { return "Version"; }
/*! this text is generated when the \\date command is used. */
virtual QCString trDate()
- {
- return "Date"; }
+ { return "Date"; }
/*! this text is generated when the \\return command is used. */
virtual QCString trReturns()
- {
- return "Renvoie"; }
+ { return "Renvoie"; }
/*! this text is generated when the \\sa command is used. */
virtual QCString trSeeAlso()
- {
- return "Voir également"; }
+ { return "Voir également"; }
/*! this text is generated when the \\param command is used. */
virtual QCString trParameters()
- {
- return "Paramètres"; }
+ { return "Paramètres"; }
/*! this text is generated when the \\exception command is used. */
virtual QCString trExceptions()
- {
- return "Exceptions"; }
+ { return "Exceptions"; }
/*! this text is used in the title page of a LaTeX document. */
virtual QCString trGeneratedBy()
- {
- return "Généré par"; }
+ { return "Généré par"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990307
@@ -684,8 +631,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! used as the title of page containing all the index of all namespaces. */
virtual QCString trNamespaceList()
- {
- return "Liste des espaces de nommage"; }
+ { return "Liste des espaces de nommage"; }
/*! used as an introduction to the namespace list */
virtual QCString trNamespaceListDescription(bool extractAll)
@@ -700,8 +646,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
* friends of a class
*/
virtual QCString trFriends()
- {
- return "Amis"; }
+ { return "Amis"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990405
@@ -711,8 +656,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
* related classes
*/
virtual QCString trRelatedFunctionDocumentation()
- {
- return "Documentation des fonctions amies et associées"; }
+ { return "Documentation des fonctions amies et associées"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990425
@@ -723,26 +667,20 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
ClassDef::CompoundType compType,
bool isTemplate)
{
- QCString result="Référence de ";
+ QCString result="Référence ";
+ if (isTemplate) result+="du modèle ";
+ result+="de ";
switch(compType)
{
- case ClassDef::Class: result+="la classe ";
- break;
- case ClassDef::Struct: result+="la structure ";
- break;
- case ClassDef::Union: result+="l'union ";
- break;
- case ClassDef::Interface: result+="l'interface ";
- break;
- case ClassDef::Protocol: result+="le protocol ";
- break;
- case ClassDef::Category: result+="la catégorie ";
- break;
- case ClassDef::Exception: result+="l'exception ";
- break;
+ case ClassDef::Class: result+="la classe "; break;
+ case ClassDef::Struct: result+="la structure "; break;
+ case ClassDef::Union: result+="l'union "; break;
+ case ClassDef::Interface: result+="l'interface "; break;
+ case ClassDef::Protocol: result+="le protocol "; break;
+ case ClassDef::Category: result+="la catégorie "; break;
+ case ClassDef::Exception: result+="l'exception "; break;
}
result+=(QCString)clName;
- if (isTemplate) result+=" (modèle)";
return result;
}
@@ -763,35 +701,25 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
}
virtual QCString trPublicMembers()
- {
- return "Fonctions membres publiques"; }
+ { return "Fonctions membres publiques"; }
virtual QCString trPublicSlots()
- {
- return "Connecteurs publics"; }
+ { return "Connecteurs publics"; }
virtual QCString trSignals()
- {
- return "Signaux"; }
+ { return "Signaux"; }
virtual QCString trStaticPublicMembers()
- {
- return "Fonctions membres publiques statiques"; }
+ { return "Fonctions membres publiques statiques"; }
virtual QCString trProtectedMembers()
- {
- return "Fonctions membres protégées"; }
+ { return "Fonctions membres protégées"; }
virtual QCString trProtectedSlots()
- {
- return "Connecteurs protégés"; }
+ { return "Connecteurs protégés"; }
virtual QCString trStaticProtectedMembers()
- {
- return "Fonctions membres protégées statiques"; }
+ { return "Fonctions membres protégées statiques"; }
virtual QCString trPrivateMembers()
- {
- return "Fonctions membres privées"; }
+ { return "Fonctions membres privées"; }
virtual QCString trPrivateSlots()
- {
- return "Connecteurs privés"; }
+ { return "Connecteurs privés"; }
virtual QCString trStaticPrivateMembers()
- {
- return "Fonctions membres privées statiques"; }
+ { return "Fonctions membres privées statiques"; }
/*! this function is used to produce a comma-separated list of items.
* use generateMarker(i) to indicate where item i should be put.
@@ -852,15 +780,14 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! This is put above each page as a link to all members of namespaces. */
virtual QCString trNamespaceMembers()
- {
- return "Membres de l'espace de nommage"; }
+ { return "Membres de l'espace de nommage"; }
/*! This is an introduction to the page with all namespace members */
virtual QCString trNamespaceMemberDescription(bool extractAll)
{
QCString result="Liste de tous les membres des espaces de nommage ";
if (!extractAll) result+="documentés ";
- result+="avec liens vers ";
+ result+="avec des liens vers ";
if (extractAll)
result+="la documentation de namespace de chaque membre :";
else
@@ -871,15 +798,13 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
* index of all namespaces.
*/
virtual QCString trNamespaceIndex()
- {
- return "Index des espaces de nommage"; }
+ { return "Index des espaces de nommage"; }
/*! This is used in LaTeX as the title of the chapter containing
* the documentation of all namespaces.
*/
virtual QCString trNamespaceDocumentation()
- {
- return "Documentation des espaces de nommage"; }
+ { return "Documentation des espaces de nommage"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990522
@@ -889,8 +814,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
* namespaces in a file.
*/
virtual QCString trNamespaces()
- {
- return "Espaces de nommage"; }
+ { return "Espaces de nommage"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990728
@@ -907,21 +831,13 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
QCString result=(QCString)"La documentation de ";
switch(compType)
{
- case ClassDef::Class: result+="cette classe";
- break;
- case ClassDef::Struct: result+="cette structure";
- break;
- case ClassDef::Union: result+="cette union";
- break;
- case ClassDef::Interface: result+="cette interface";
- break;
- case ClassDef::Protocol: result+="ce protocol";
- female = false;
- break;
- case ClassDef::Category: result+="cette catégorie";
- break;
- case ClassDef::Exception: result+="cette exception";
- break;
+ case ClassDef::Class: result+="cette classe"; break;
+ case ClassDef::Struct: result+="cette structure"; break;
+ case ClassDef::Union: result+="cette union"; break;
+ case ClassDef::Interface: result+="cette interface"; break;
+ case ClassDef::Protocol: result+="ce protocol"; female = false; break;
+ case ClassDef::Category: result+="cette catégorie"; break;
+ case ClassDef::Exception: result+="cette exception"; break;
}
if (female) result+= " a été générée à partir ";
else result+=" a été généré à partir ";
@@ -934,8 +850,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
* list.
*/
virtual QCString trAlphabeticalList()
- {
- return "Liste alphabétique"; }
+ { return "Liste alphabétique"; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-990901
@@ -943,21 +858,18 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! This is used as the heading text for the retval command. */
virtual QCString trReturnValues()
- {
- return "Valeurs retournées"; }
+ { return "Valeurs retournées"; }
/*! This is in the (quick) index as a link to the main page (index.html)
*/
virtual QCString trMainPage()
- {
- return "Page principale"; }
+ { return "Page principale"; }
/*! This is used in references to page that are put in the LaTeX
* documentation. It should be an abbreviation of the word page.
*/
virtual QCString trPageAbbreviation()
- {
- return "p."; }
+ { return "p."; }
//////////////////////////////////////////////////////////////////////////
// new since 0.49-991003
@@ -1111,7 +1023,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! Used as a marker that is put before a \\todo item */
virtual QCString trTodo()
{
- return "À faire";
+ return "A faire";
}
/*! Used as the header of the todo list */
virtual QCString trTodoList()
@@ -1207,16 +1119,16 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
"</ul>\n"
"Les flèches ont la signification suivante :\n"
"<ul>\n"
- "<li>Une flèche bleu foncé est utilisée pour visualiser une relation d'héritage public "
+ "<li>Une flèche bleu foncé est utilisée pour visualiser une relation d'héritage publique "
"entre deux classes.\n"
- "<li>Une flèche vert foncé est utilisée pour une relation d'héritage protégé.\n"
- "<li>Une flèche rouge foncé est utilisée pour une relation d'héritage privé.\n"
+ "<li>Une flèche vert foncé est utilisée pour une relation d'héritage protégée.\n"
+ "<li>Une flèche rouge foncé est utilisée pour une relation d'héritage privée.\n"
"<li>Une flèche violette en pointillés est utilisée si une classe est contenue ou "
"utilisée par une autre classe. La flèche est étiquetée avec la ou les variable(s) "
"qui permettent d'accéder à la classe ou structure pointée. \n"
- "<li>Une flèche verte en pointillés indique une relation entre une classe instanciée et "
- "le modèle de classe utilisé. La flèche est étiquetée avec "
- "les paramètres de modèle de la classe instanciée.\n"
+ "<li>Une flèche jaune en pointillés indique une relation entre un modèle d'instance et "
+ "le modèle de classe duquel il est instancié. La flèche est étiquetée avec "
+ "les paramètres de modèle de l'instance.\n"
"</ul>\n";
}
/*! text for the link to the legend page */
@@ -1301,7 +1213,6 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
{
return "Paquetages";
}
-
/*! Text shown before a multi-line define */
virtual QCString trDefineValue()
{
@@ -1445,8 +1356,8 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
*/
virtual QCString trGlobal(bool first_capital, bool singular)
{
- QCString result((first_capital ? "Global(e)" : "global(e)"));
- if (!singular) result+="s";
+ QCString result((first_capital ? "Globa" : "globa"));
+ if (!singular) result+="ux(ales)"; else result+="l(e)";
return result;
}
@@ -1661,29 +1572,25 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
* hierarchy.
*/
virtual QCString trDirIndex()
- {
- return "Hiérarchie de répertoires"; }
+ { return "Hiérarchie de répertoires"; }
/*! This is used as the name of the chapter containing the documentation
* of the directories.
*/
virtual QCString trDirDocumentation()
- {
- return "Documentation des répertoires"; }
+ { return "Documentation des répertoires"; }
/*! This is used as the title of the directory index and also in the
* Quick links of a HTML page, to link to the directory hierarchy.
*/
virtual QCString trDirectories()
- {
- return "Répertoires"; }
+ { return "Répertoires"; }
/*! This returns a sentences that introduces the directory hierarchy.
* and the fact that it is sorted alphabetically per level
*/
virtual QCString trDirDescription()
- {
- return "Cette hiérarchie de répertoire est triée approximativement, "
+ { return "Cette hiérarchie de répertoire est triée approximativement, "
"mais pas complètement, par ordre alphabétique :";
}
@@ -1691,10 +1598,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
* directory is passed via \a dirName.
*/
virtual QCString trDirReference(const char *dirName)
- {
- QCString result="Répertoire de référence de "; result+=dirName;
- return result;
- }
+ { QCString result="Répertoire de référence de "; result+=dirName; return result; }
/*! This returns the word directory with or without starting capital
* (\a first_capital) and in sigular or plural form (\a singular).
@@ -1702,8 +1606,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
virtual QCString trDir(bool first_capital, bool singular)
{
QCString result((first_capital ? "Répertoire" : "répertoire"));
- if (singular) result+="";
- else result+="s";
+ if (singular) result+=""; else result+="s";
return result;
}
@@ -1728,7 +1631,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! This is used to introduce a caller (or called-by) graph */
virtual QCString trCallerGraph()
{
- return "Voici le graphe d'appel pour cette fonction :";
+ return "Voici le graphe des appelants de cette fonction :";
}
/*! This is used in the documentation of a file/namespace before the list
@@ -1743,7 +1646,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! header that is put before the list of member subprograms (Fortran). */
virtual QCString trMemberFunctionDocumentationFortran()
- { return "Documentation des fonctions membres/subroutine"; }
+ { return "Documentation des fonctions/subroutines membres"; }
/*! This is put above each page as a link to the list of annotated data types (Fortran). */
virtual QCString trCompoundListFortran()
@@ -1760,13 +1663,12 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! This is an introduction to the page with all data types (Fortran). */
virtual QCString trCompoundMembersDescriptionFortran(bool extractAll)
{
- QCString result="Liste de tous les ";
- result+="membres de types de données ";
+ QCString result="Liste de tous les membres de types de données ";
if (!extractAll)
{
result+="documentés ";
}
- result+="avec liens vers ";
+ result+="avec des liens vers ";
if (!extractAll)
{
result+="la documentation de la structure des données de chaque membre :";
@@ -1800,7 +1702,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
* of documentation blocks for subprograms (Fortran)
*/
virtual QCString trSubprogramDocumentation()
- { return "Documentation de la Fonction/Subroutine"; }
+ { return "Documentation de la fonction/subroutine"; }
/*! This is used in the documentation of a file/namespace/group before
* the list of links to documented compounds (Fortran)
@@ -1815,7 +1717,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! used as an introduction to the modules list (Fortran) */
virtual QCString trModulesListDescription(bool extractAll)
{
- QCString result="Liste de tous les modules";
+ QCString result="Liste de tous les modules ";
if (!extractAll) result+="documentés ";
result+="avec une brève description :";
return result;
@@ -1827,7 +1729,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
bool isTemplate)
{
QCString result="Réference ";
- if (isTemplate) result+="du gabarit (template) ";
+ if (isTemplate) result+="du modèle ";
switch(compType)
{
case ClassDef::Class: result+="du module "; break;
@@ -1858,7 +1760,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
{
QCString result="Liste de tous les membres ";
if (!extractAll) result+="documentés ";
- result+="du module avec lien vers ";
+ result+="du module avec des liens vers ";
if (extractAll)
{
result+="la documentation du module de chaque membre :";
@@ -1935,7 +1837,7 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
/*! C# Type Constraint list */
virtual QCString trTypeConstraints()
{
- return "Les constraintes du type";
+ return "Contraintes de type";
}
//////////////////////////////////////////////////////////////////////////
@@ -1976,14 +1878,73 @@ class TranslatorFrench : public TranslatorAdapter_1_6_3
// new since 1.6.3
//////////////////////////////////////////////////////////////////////////
+ /*! introduction text for the directory dependency graph */
+ virtual QCString trDirDependency(const char *name)
+ {
+ return (QCString)"Graphe des dépendances de répertoire pour "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the first column mentions the
+ * source file that has a relation to another file.
+ */
+ virtual QCString trFileIn(const char *name)
+ {
+ return (QCString)"Fichier dans "+name;
+ }
+
+ /*! when clicking a directory dependency label, a page with a
+ * table is shown. The heading for the second column mentions the
+ * destination file that is included.
+ */
+ virtual QCString trIncludesFileIn(const char *name)
+ {
+ return (QCString)"Inclut le fichier dans "+name;
+ }
+
+ /** Compiles a date string.
+ * @param year Year in 4 digits
+ * @param month Month of the year: 1=January
+ * @param day Day of the Month: 1..31
+ * @param dayOfWeek Day of the week: 1=Monday..7=Sunday
+ * @param hour Hour of the day: 0..23
+ * @param minutes Minutes in the hour: 0..59
+ * @param seconds Seconds within the minute: 0..59
+ * @param includeTime Include time in the result string?
+ */
+ virtual QCString trDateTime(int year,int month,int day,int dayOfWeek,
+ int hour,int minutes,int seconds,
+ bool includeTime)
+ {
+ static const char *days[] = { "Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche" };
+ static const char *months[] = { "Janvier","Février","Mars","Avril","Mai","Juin","Juillet","Août","Septembre","Octobre","Novembre","Décembre" };
+ QCString sdate;
+ sdate.sprintf("%s %s %d %d",days[dayOfWeek-1],months[month-1],day,year);
+ if (includeTime)
+ {
+ QCString stime;
+ stime.sprintf(" %.2d:%.2d:%.2d",hour,minutes,seconds);
+ sdate+=stime;
+ }
+ return sdate;
+ }
+
//////////////////////////////////////////////////////////////////////////
// new since 1.7.5
//////////////////////////////////////////////////////////////////////////
+ /*! Header for the page with bibliographic citations */
virtual QCString trCiteReferences()
- { return "Bibliographie"; }
+ { return "Références bibliographiques"; }
+
+ /*! Text for copyright paragraph */
+ virtual QCString trCopyright()
+ { return "Copyright"; }
+
+ /*! Header for the graph showing the directory dependencies */
+ virtual QCString trDirDepGraph(const char *name)
+ { return QCString("Graphe des dépendances de répertoires pour ")+name+":"; }
};
#endif
-
diff --git a/src/translator_it.h b/src/translator_it.h
index cf8db94..f3f9245 100644
--- a/src/translator_it.h
+++ b/src/translator_it.h
@@ -2,7 +2,7 @@
*
*
*
- * Copyright (C) 1997-2010 by Dimitri van Heesch.
+ * Copyright (C) 1997-2011 by Dimitri van Heesch.
*
* Permission to use, copy, modify, and distribute this software and its
* documentation under the terms of the GNU General Public License is hereby
diff --git a/src/util.cpp b/src/util.cpp
index 3ecdfb6..62f8443 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -4711,7 +4711,8 @@ QCString showFileDefMatches(const FileNameDict *fnDict,const char *n)
//----------------------------------------------------------------------
-QCString substituteKeywords(const QCString &s,const char *title)
+QCString substituteKeywords(const QCString &s,const char *title,
+ const char *projName,const char *projNum,const char *projBrief)
{
QCString result = s;
if (title) result = substitute(result,"$title",title);
@@ -4719,9 +4720,9 @@ QCString substituteKeywords(const QCString &s,const char *title)
result = substitute(result,"$date",dateToString(FALSE));
result = substitute(result,"$year",yearToString());
result = substitute(result,"$doxygenversion",versionString);
- result = substitute(result,"$projectname",Config_getString("PROJECT_NAME"));
- result = substitute(result,"$projectnumber",Config_getString("PROJECT_NUMBER"));
- result = substitute(result,"$projectbrief",Config_getString("PROJECT_BRIEF"));
+ result = substitute(result,"$projectname",projName);
+ result = substitute(result,"$projectnumber",projNum);
+ result = substitute(result,"$projectbrief",projBrief);
result = substitute(result,"$projectlogo",stripPath(Config_getString("PROJECT_LOGO")));
return result;
}
diff --git a/src/util.h b/src/util.h
index dc783d1..07030b3 100644
--- a/src/util.h
+++ b/src/util.h
@@ -234,7 +234,8 @@ bool rightScopeMatch(const QCString &scope, const QCString &name);
bool leftScopeMatch(const QCString &scope, const QCString &name);
-QCString substituteKeywords(const QCString &s,const char *title);
+QCString substituteKeywords(const QCString &s,const char *title,
+ const char *projName,const char *projNum,const char *projBrief);
int getPrefixIndex(const QCString &name);