diff options
author | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2001-07-23 14:06:43 (GMT) |
---|---|---|
committer | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2001-07-23 14:06:43 (GMT) |
commit | ea8a1bc7ccbd7b64a31c293caa31240bde7397cf (patch) | |
tree | 8bdbe4421ef1ea29861efd26ccfc83849a184148 | |
parent | 5346e18047c0e047db2f1b13dc2c767a73c5c305 (diff) | |
download | Doxygen-ea8a1bc7ccbd7b64a31c293caa31240bde7397cf.zip Doxygen-ea8a1bc7ccbd7b64a31c293caa31240bde7397cf.tar.gz Doxygen-ea8a1bc7ccbd7b64a31c293caa31240bde7397cf.tar.bz2 |
Release-1.2.8-20010723
53 files changed, 4715 insertions, 1407 deletions
@@ -1,6 +1,6 @@ -DOXYGEN Version 1.2.8-20010715 +DOXYGEN Version 1.2.8-20010723 Please read the installation section of the manual for instructions. -------- -Dimitri van Heesch (15 July 2001) +Dimitri van Heesch (23 July 2001) diff --git a/Makefile.win_make.in b/Makefile.win_make.in index d0a7eb2..7b6ad6a 100644 --- a/Makefile.win_make.in +++ b/Makefile.win_make.in @@ -27,6 +27,6 @@ ps: docs cd latex & $(MAKE) src\version.cpp: Makefile - echo char versionString[]="$(VERSION)"; > src\version.cpp + echo char versionString[]="""$(VERSION)"""; > src\version.cpp FORCE: @@ -1,4 +1,4 @@ -DOXYGEN Version 1.2.8_20010715 +DOXYGEN Version 1.2.8_20010723 Please read INSTALL for compilation instructions. @@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. Enjoy, -Dimitri van Heesch (dimitri@stack.nl) (15 July 2001) +Dimitri van Heesch (dimitri@stack.nl) (23 July 2001) @@ -1 +1 @@ -1.2.8-20010715 +1.2.8-20010723 diff --git a/addon/doxywizard/Makefile.in b/addon/doxywizard/Makefile.in index 1b56e9a..ca5e11d 100644 --- a/addon/doxywizard/Makefile.in +++ b/addon/doxywizard/Makefile.in @@ -10,15 +10,9 @@ # See the GNU General Public License for more details. # -all: config.l config.h Makefile.doxywizard +all: Makefile.doxywizard $(MAKE) -f Makefile.doxywizard $@ -config.l: - $(CP) ../../src/config.l config.l - -config.h: - $(CP) ../../src/config.h config.h - Makefile.doxywizard: doxywizard.pro $(ENV) $(PERL) $(TMAKE) doxywizard.pro >Makefile.doxywizard @@ -29,7 +23,7 @@ clean: Makefile.doxywizard $(MAKE) -f Makefile.doxywizard clean distclean: clean - $(RM) Makefile.doxywizard config.l config.h config.cpp + $(RM) Makefile.doxywizard install: $(INSTTOOL) -d $(INSTALL)/bin diff --git a/addon/doxywizard/Makefile.win_nmake.in b/addon/doxywizard/Makefile.win_nmake.in new file mode 100644 index 0000000..a9f86a9 --- /dev/null +++ b/addon/doxywizard/Makefile.win_nmake.in @@ -0,0 +1,37 @@ +# +# +# +# Copyright (C) 1997-2001 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: config.h config.l unistd.h Makefile.doxywizard + $(MAKE) -f Makefile.doxywizard $@ + +unistd.h: + $(CP) ..\..\src\unistd.h unistd.h + +config.h: + $(CP) ..\..\src\config.h config.h + +config.l: + $(CP) ..\..\src\config.l config.l + +Makefile.doxywizard: doxywizard.pro + $(ENV) $(PERL) $(TMAKE) doxywizard.pro >Makefile.doxywizard + +tmake: + $(ENV) $(PERL) $(TMAKE) doxywizard.pro >Makefile.doxywizard + +clean: Makefile.doxywizard + $(MAKE) -f Makefile.doxywizard clean + +distclean: clean + $(RM) Makefile.doxywizard config.cpp + +FORCE: diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp index 2495d87..3fcde0b 100644 --- a/addon/doxywizard/doxywizard.cpp +++ b/addon/doxywizard/doxywizard.cpp @@ -56,32 +56,23 @@ static bool loadConfig( QString loadFile ) ); return FALSE; } - QFile f( loadFile ); - if ( !f.open(IO_ReadOnly) ) - { - QMessageBox::warning(0, - "Warning","Cannot open input "+loadFile+ - " for reading!.", - "abort" - ); - exit(1); - } // set config values to their defaults Config::instance()->init(); - // read file into a string buffer - int fsize = fi.size(); - QCString contents(fsize+1); // add room for \0 terminator - f.readBlock(contents.data(),fsize); - contents[fsize]='\0'; - // parse the config file // this will initialize the various Config data members - Config::instance()->parse(contents,loadFile); + if (Config::instance()->parse(loadFile)) + { + QMessageBox::warning(0, + "Warning","Cannot open or read input "+loadFile+"!", + "abort" + ); + return FALSE; + } + Config::instance()->convertStrToVal(); - f.close(); return TRUE; } @@ -322,7 +313,7 @@ void Wizard::about() "<qt><center>A tool to create and edit configuration files " "that can be read by doxygen.</center><p>" "<center>Written by Dimitri van Heesch</center><p>" - "<center>(c) 2000</center></qt>" + "<center>(c) 2000-2001</center></qt>" ); } diff --git a/addon/doxywizard/doxywizard.pro.in b/addon/doxywizard/doxywizard.pro.in index 3e96901..5337781 100644 --- a/addon/doxywizard/doxywizard.pro.in +++ b/addon/doxywizard/doxywizard.pro.in @@ -12,7 +12,8 @@ # project file for the doxywizard project # special template configuration file because we use flex -TEMPLATE = doxywizard.t +unix:TEMPLATE = app.t +win32:TEMPLATE = doxywizard.t # executable to generate TARGET = ../../bin/doxywizard @@ -28,8 +29,8 @@ HEADERS = doxywizard.h \ inputbool.h \ inputstrlist.h \ inputint.h \ - config.h \ pixmaps.h +win32:HEADERS += config.h # source flle for the project SOURCES = doxywizard.cpp \ @@ -39,8 +40,8 @@ SOURCES = doxywizard.cpp \ inputbool.cpp \ inputstrlist.cpp \ inputint.cpp \ - config.cpp \ pixmaps.cpp +win32:SOURCES += config.cpp # where to put the objects OBJECTS_DIR = obj @@ -49,7 +50,12 @@ OBJECTS_DIR = obj MOC_DIR = moc # extra C++ compiler options -TMAKE_CXXFLAGS += -DDOXYWIZARD -win32:TMAKE_CXXFLAGS += -I. -DQT_DLL -win32:TMAKE_LIBS = $(QTDIR)\lib\qtmain.lib $(QTDIR)\lib\qt-mt230nc.lib user32.lib gdi32.lib comdlg32.lib imm32.lib ole32.lib uuid.lib wsock32.lib +INCLUDEPATH += ../../src +win32:TMAKE_CXXFLAGS += -DQT_DLL +win32:INCLUDEPATH += . + +# extra link options +win32:TMAKE_LIBS = $(QTDIR)\lib\qtmain.lib $(QTDIR)\lib\qt-mt230nc.lib user32.lib gdi32.lib comdlg32.lib imm32.lib ole32.lib uuid.lib wsock32.lib +win32:TMAKE_LIBS_QT = +unix:LIBS = -L../../lib -ldoxycfg diff --git a/addon/doxywizard/doxywizard_templ.cpp b/addon/doxywizard/doxywizard_templ.cpp deleted file mode 100644 index cafec21..0000000 --- a/addon/doxywizard/doxywizard_templ.cpp +++ /dev/null @@ -1,363 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2001 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. - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <qmainwindow.h> -#include <qpopupmenu.h> -#include <qfileinfo.h> -#include <qmenubar.h> -#include <qstatusbar.h> -#include <qfiledialog.h> -#include <qmessagebox.h> -#include <qapplication.h> -#include <qwhatsthis.h> -#include <qlayout.h> -#include <qtabwidget.h> -#include <qtoolbar.h> -#include <qtoolbutton.h> - -#include "doxywizard.h" -#include "pagewidget.h" -#include "inputbool.h" -#include "inputstring.h" -#include "inputstrlist.h" -#include "inputint.h" -#include "config.h" -#include "version.h" -#include "pixmaps.h" - -QString configFileName; - -const int messageTimeout = 4000; //!< status bar message timeout in millisec. - -//------------------------------------------------------------------------- - -static bool loadConfig( QString loadFile ) -{ - QFileInfo fi( loadFile ); - if ( !fi.exists() ) - { - QMessageBox::warning(0, - "Warning","Input file "+loadFile+ - " does not exist! Starting new file.", - "ok" - ); - return FALSE; - } - QFile f( loadFile ); - if ( !f.open(IO_ReadOnly) ) - { - QMessageBox::warning(0, - "Warning","Cannot open input "+loadFile+ - " for reading!.", - "abort" - ); - exit(1); - } - - // set config values to their defaults - Config::init(); - - // read file into a string buffer - int fsize = fi.size(); - QCString contents(fsize+1); // add room for \0 terminator - f.readBlock(contents.data(),fsize); - contents[fsize]='\0'; - - // parse the config file - // this will initialize the various Config data members - parseConfig(contents,loadFile); - configStrToVal(); - - f.close(); - return TRUE; -} - -static bool saveConfig( QString saveFile ) -{ - QFile f( saveFile ); - if ( !f.open(IO_WriteOnly) ) - { - QMessageBox::warning(0, - "Warning","Cannot open file "+saveFile+ - " for writing. Nothing saved!.", - "ok" - ); - return FALSE; // failure - } - - writeTemplateConfig(&f,TRUE); // write brief config file - - return TRUE; // success -} - -//-------------------------------------------------------------------------- - -Wizard::Wizard(int argc,char **argv) : - QMainWindow( 0, (QCString)"DoxyWizard v"+versionString ) -{ - // File popupmenu - - hasChanged=FALSE; - - fileTools = new QToolBar( this, "file operations" ); - fileTools->setLabel( "File Operations" ); - - new QToolButton( QPixmap( file_xpm ), "New File", QString::null, - this, SLOT(newFile()), fileTools, "new file" ); - - //QToolButton * fileOpen = - new QToolButton( QPixmap( fileopen_xpm ), "Open File", QString::null, - this, SLOT(loadFile()), fileTools, "open file" ); - - //QToolButton * fileSave = - new QToolButton( QPixmap( filesave_xpm ), "Save File", QString::null, - this, SLOT(saveFile()), fileTools, "save file" ); - - //Micha: QToolButton * = - new QToolButton( QPixmap( rundoxygen_xpm ), "Save and Run doxygen", QString::null, - this, SLOT(runDoxygen()), fileTools, "save and run doxygen" ); - - - QWhatsThis::whatsThisButton( fileTools ); - - QPopupMenu* file = new QPopupMenu; - file->insertItem( QIconSet(QPixmap(file_xpm)), - "&New", this, SLOT(newFile()), CTRL+Key_N ); - file->insertItem( QIconSet(QPixmap(fileopen_xpm)), - "&Load", this, SLOT(loadFile()), CTRL+Key_O ); - file->insertSeparator(); - file->insertItem( QIconSet(QPixmap(filesave_xpm)), - "&Save", this, SLOT(saveFile()), CTRL+Key_S ); - file->insertItem( "&Save as ...", this, SLOT(saveAsFile()) ); - file->insertSeparator(); - file->insertItem( "&Quit", this, SLOT(quit()), CTRL+Key_Q ); - - // Doxygen popupmenu - QPopupMenu* doxygen = new QPopupMenu; - int itemIndex = doxygen->insertItem( QIconSet(QPixmap(rundoxygen_xpm)), - "&Run", this, SLOT(runDoxygen()), CTRL+Key_R ); - doxygen->setWhatsThis ( itemIndex, "Run doxygen with the current configuration file..." ); - - // Help popupmenu - QPopupMenu* help = new QPopupMenu; - help->insertItem( "&About", this, SLOT(about()), Key_F1 ); - help->insertItem( "What's &This", this , SLOT(whatsThis()), SHIFT+Key_F1); - - // menubar definition - menuBar()->insertItem( "&File", file ); - menuBar()->insertItem( "&Doxygen", doxygen ); - menuBar()->insertSeparator(); - menuBar()->insertItem( "&Help", help ); - - statusBar()->message("Welcome to DoxyWizard",messageTimeout); - - cw = new ConfigFile( this ); - connect(cw,SIGNAL(changed()),this,SLOT(changed())); - setCentralWidget( cw ); - cw->show(); - - if (argc==2) - { - loadFile(argv[1]); - } - else - { - newFile(); - } - refreshCaption(); - - resize( 640, 480 ); - -} - -void Wizard::newFile() -{ - if (hasChanged) - { - switch( QMessageBox::warning( this, "DoxyWizard", "Start a new file and lose changes?\n", - "Yes", "No", 0, 0, 1 )) - { - case 0: - break; - default: // command aborted by the user - return; - } - } - Config::init(); - configFileName="Doxyfile"; - cw->init(); -} - -void Wizard::loadFile(const char *fileName) -{ - if (fileName==0) - { - configFileName = QFileDialog::getOpenFileName(); - } - else - { - configFileName = fileName; - } - - if ( !configFileName.isNull() ) - { - //initData( configFileName ); - loadConfig(configFileName); - cw->init(); - - statusBar()->message(configFileName, messageTimeout); - } -} - -void Wizard::loadFile() -{ - if (hasChanged) - { - switch( QMessageBox::warning( - this, "DoxyWizard", "Load a new file and lose changes?\n", - "Yes", "No", 0, 0, 1 )) - { - case 0: - break; - default: // command aborted by the user - return; - } - } - loadFile(0); -} - -void Wizard::saveFile() -{ - //printf("configFileName=`%s'\n",configFileName.data()); - if (configFileName.isEmpty()) - { - saveAsFile(); - return; - } - else - { - saveConfig(configFileName); - statusBar()->message(configFileName + " saved", messageTimeout); - } - hasChanged = FALSE; - refreshCaption(); -} - -void Wizard::saveAsFile() -{ - configFileName = QFileDialog::getSaveFileName(); - if (configFileName.isNull()) - { - statusBar()->message("Save aborted", messageTimeout ); - return; // operation cancelled by the user - } - - saveConfig(configFileName); - statusBar()->message("Saved as "+ configFileName, messageTimeout ); -} - -//Micha -void Wizard::runDoxygen() -{ - saveFile(); - QString s = "doxygen " + configFileName; - system((const char*)s); - statusBar()->message("doxygen completed: "+ configFileName, messageTimeout ); - hasChanged = FALSE; - refreshCaption(); -} - - -void Wizard::quit() -{ - if (hasChanged) - { - switch( QMessageBox::warning( this, "DoxyWizard", "Quit and lose changes?\n", - "Yes", "No", 0, 0, 1 )) - { - case 0: - qApp->quit(); - break; - case 1: - break; - } - } - else - { - qApp->quit(); - } -} - -void Wizard::changed() -{ - hasChanged = TRUE; - refreshCaption(); -} - -void Wizard::refreshCaption() -{ - QString s; - if (hasChanged) s=" *"; - setCaption("Doxywizard - ["+configFileName+s+"]"); -} - -void Wizard::about() -{ - QMessageBox::about(this, "DoxyWizard", - "<qt><center>A tool to create and edit configuration files " - "that can be read by doxygen.</center><p>" - "<center>Written by Dimitri van Heesch</center><p>" - "<center>(c) 2000</center></qt>" - ); -} - -//---------------------------------------------------------------------- - -ConfigFile::ConfigFile( QWidget *parent ) : QWidget( parent ) -{ - QVBoxLayout *layout = new QVBoxLayout( this ); - - // QTabWidget definition - QTabWidget *tab = new QTabWidget( this ); - layout->addWidget( tab ); - -#CONFIG Widgets0 -#CONFIG Widgets1 - -} - -ConfigFile::~ConfigFile() -{ -} - -#CONFIG WidgetSlotImpl - -void ConfigFile::init() -{ -#CONFIG WidgetInit -} - -//---------------------------------------------------------------------- - -int main(int argc,char **argv) -{ - QApplication::setColorSpec( QApplication::NormalColor ); - QApplication app(argc,argv); - Wizard wizard(argc,argv); - app.setMainWidget( &wizard ); - wizard.show(); - return app.exec(); -} diff --git a/addon/doxywizard/doxywizard_templ.h b/addon/doxywizard/doxywizard_templ.h deleted file mode 100644 index 92e35e1..0000000 --- a/addon/doxywizard/doxywizard_templ.h +++ /dev/null @@ -1,76 +0,0 @@ -/****************************************************************************** - * - * - * - * Copyright (C) 1997-2001 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. - * - */ - -#ifndef _DOXWIZARD_H -#define _DOXWIZARD_H - -#include <qmainwindow.h> - -class QToolBar; -class ConfigFile; -class InputBool; -class InputString; -class InputStrList; -class InputFile; -class InputDir; -class InputInt; - -class Wizard : public QMainWindow -{ - Q_OBJECT - - public: - Wizard(int argc,char **argv); - ~Wizard(){}; - void loadFile(const char *s); - - private slots: - void newFile(); - void loadFile(); - void saveFile(); - void saveAsFile(); - void quit(); - void changed(); - void about(); - void runDoxygen(); // Micha - - signals: - - private: - void refreshCaption(); - QToolBar *fileTools; - bool hasChanged; - ConfigFile *cw; -}; - -class ConfigFile : public QWidget -{ - Q_OBJECT - - public: - ConfigFile(QWidget *parent=0); - ~ConfigFile(); - void init(); - - signals: - void changed(); - - private slots: -#CONFIG WidgetSlots - - private: -#CONFIG WidgetVars -}; - -#endif diff --git a/doc/Makefile.in b/doc/Makefile.in index db61bf9..4deee03 100644 --- a/doc/Makefile.in +++ b/doc/Makefile.in @@ -31,6 +31,6 @@ clean: language: language.doc language.doc: $(wildcard ../src/translator*.h) maintainers.txt language.tpl translator.pl - $(PERL) translator.pl + $(ENV) VERSION=$(VERSION) DOXYGEN_DOCDIR=. $(PERL) translator.pl FORCE: diff --git a/doc/Makefile.win_make.in b/doc/Makefile.win_make.in index f881667..3161b31 100644 --- a/doc/Makefile.win_make.in +++ b/doc/Makefile.win_make.in @@ -31,6 +31,6 @@ clean: language: language.doc language.doc: maintainers.txt language.tpl translator.pl - $(PERL) translator.pl + set DOXYGEN_DOCDIR=. & set VERSION=$(VERSION) & $(PERL) translator.pl FORCE: diff --git a/doc/Makefile.win_nmake.in b/doc/Makefile.win_nmake.in index 13e386d..05820b0 100644 --- a/doc/Makefile.win_nmake.in +++ b/doc/Makefile.win_nmake.in @@ -31,6 +31,8 @@ clean: language: language.doc language.doc: maintainers.txt language.tpl translator.pl + set DOXYGEN_DOCDIR=. + set VERSION=$(VERSION) $(PERL) translator.pl FORCE: diff --git a/doc/faq.doc b/doc/faq.doc index 4fb9a63..1ed33dc 100644 --- a/doc/faq.doc +++ b/doc/faq.doc @@ -210,9 +210,6 @@ generator -> gen At the time I was looking into lex and yacc, where a lot of things start with "yy", so the "y" slipped in and made things pronouncable. -I realized later that doxygen could also be read as Dimitri's oxygen, -which could be seen as something I need to live :-) - </ol> \htmlonly diff --git a/doc/language.doc b/doc/language.doc index d97ed69..111616c 100644 --- a/doc/language.doc +++ b/doc/language.doc @@ -24,20 +24,19 @@ Doxygen has built-in support for multiple languages. This means that the text fragments that doxygen generates can be produced in languages other than English (the default) at configuration time. -<p> -Currently (version unknown), 23 languages + +Currently (version 1.2.8-20010723), 24 languages are supported (sorted alphabetically): Brazilian Portuguese, Chinese, Croatian, Czech, Danish, Dutch, English, Finnish, French, German, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Romanian, Russian, Slovak, -Slovene, Spanish, and Swedish. +Slovene, Spanish, Swedish, and Ukrainian. The table of information related to the supported languages follows. It is sorted by language alphabetically. The <b>Status</b> column was generated from sources and shows approximately the last version when the translator was updated. -<p> \htmlonly <TABLE ALIGN=center CELLSPACING=0 CELLPADDING=0 BORDER=0> @@ -151,7 +150,7 @@ when the translator was updated. <TD>Portuguese</TD> <TD>Rui Godinho Lopes</TD> <TD>ruiglopes@NOSPAM.yahoo.com</TD> - <TD>1.1.5</TD> + <TD>up-to-date</TD> </TR> <TR BGCOLOR="#ffffff"> <TD>Romanian</TD> @@ -189,6 +188,12 @@ when the translator was updated. <TD>sahag96@NOSPAM.nts.mh.se<br>xet@NOSPAM.hem.passagen.se</TD> <TD>1.0.0</TD> </TR> + <TR BGCOLOR="#ffffff"> + <TD>Ukrainian</TD> + <TD>Olexij Tkatchenko</TD> + <TD>olexij.tkatchenko@NOSPAM.gmx.de</TD> + <TD>up-to-date</TD> + </TR> </TABLE> </TD> </TR> @@ -235,7 +240,7 @@ when the translator was updated. \hline Polish & Grzegorz Kowal & {\tt g\_kowal@poczta.onet.pl} & 1.2.1 \\ \hline - Portuguese & Rui Godinho Lopes & {\tt ruiglopes@yahoo.com} & 1.1.5 \\ + Portuguese & Rui Godinho Lopes & {\tt ruiglopes@yahoo.com} & up-to-date \\ \hline Romanian & Alexandru Iosup & {\tt aiosup@yahoo.com} & 1.2.1 \\ \hline @@ -250,19 +255,19 @@ when the translator was updated. Swedish & Samuel H\"{a}agglund & {\tt sahag96@nts.mh.se} & 1.0.0 \\ & XeT Erixon & {\tt xet@hem.passagen.se} & \\ \hline + Ukrainian & Olexij Tkatchenko & {\tt olexij.tkatchenko@gmx.de} & up-to-date \\ + \hline \end{tabular} \endlatexonly -Have a look at <a href="../doc/translator_report.txt" -><code>doxygen/doc/translator_report.txt</code></a> for more details. -<p> Most people on the list have indicated that they were also busy doing other things, so if you want to help to speed things up please let them (or me) know. If you want to add support for a language that is not yet listed -please see the next section. +please read the next section. + <h3>Adding a new language to doxygen</h3> @@ -306,9 +311,9 @@ Just follow these steps: To enter special characters (with accents) you can: <ul> <li> Enter them directly if your keyboard supports that and you are - using a Latin-1 font. - Doxygen will translate the characters to proper LateX and - leave the Html and man output for what it is (which is fine, if + using a Latin-1 font. Doxygen will translate the + characters to proper \f$\mbox{\LaTeX}\f$ and leave the + HTML and man output for what it is (which is fine, if idLanguageCharset() is set correctly). <li> Use html codes like \ä for an a with an umlaut (i.e. ä). See the HTML specification for the codes. @@ -451,17 +456,23 @@ the minimal number of translator adapter classes. <b>To simplify the maintenance of the language translator classes</b> for the supported languages, the \c translator.pl perl script was developed (located in \c doxygen/doc directory). -It is able to extract the important information about obsolete and -new methods from the source files for each of the languages -- see -the reference to the <em>translator report</em> ASCII file below -the table of supported languages shown earlier. Looking at the base -class of the language translator, the script guesses also the status -of the translator -- see the last column of the mentioned table. -The \c translator.pl is called automatically when the doxygen -documentation is generated. You can also run the script manualy -whenever you feel that it can help you. Of course, you are not -forced to use the results of the script. You can find the same -information by looking at the adapter class and its base classes. +It extracts the important information about obsolete and +new methods from the source files for each of the languages. +The information is stored in the <em>translator report</em> ASCII file +(<code>doxygen/doc/translator_report.txt</code>). \htmlonly If you compiled this documentation +from sources and if you have also doxygen sources available the +link <a href="../doc/translator_report.txt"> + <code>doxygen/doc/translator_report.txt</code></a> should be valid.\endhtmlonly + +Looking at the base class of the language translator, the script +guesses also the status of the translator -- see the last column of +the table with languages above. The \c translator.pl is called +automatically when the doxygen documentation is generated. You can +also run the script manualy whenever you feel that it can help you. +Of course, you are not forced to use the results of the script. You +can find the same information by looking at the adapter class and +its base classes. + <b>How should I update my language translator?</b> Firstly, you should be the language maintainer, or you should let him/her know diff --git a/doc/language.tpl b/doc/language.tpl index d81c213..7390f02 100644 --- a/doc/language.tpl +++ b/doc/language.tpl @@ -22,7 +22,7 @@ Doxygen has built-in support for multiple languages. This means that the text fragments that doxygen generates can be produced in languages other than English (the default) at configuration time. -<p> + Currently (version $version), $numlang languages are supported (sorted alphabetically): $languages. @@ -31,17 +31,16 @@ The table of information related to the supported languages follows. It is sorted by language alphabetically. The <b>Status</b> column was generated from sources and shows approximately the last version when the translator was updated. -<p> $information_table -<p> Most people on the list have indicated that they were also busy doing other things, so if you want to help to speed things up please let them (or me) know. If you want to add support for a language that is not yet listed -please see the next section. +please read the next section. + <h3>Adding a new language to doxygen</h3> @@ -85,9 +84,9 @@ Just follow these steps: To enter special characters (with accents) you can: <ul> <li> Enter them directly if your keyboard supports that and you are - using a Latin-1 font. - Doxygen will translate the characters to proper LateX and - leave the Html and man output for what it is (which is fine, if + using a Latin-1 font. Doxygen will translate the + characters to proper \f$\mbox{\LaTeX}\f$ and leave the + HTML and man output for what it is (which is fine, if idLanguageCharset() is set correctly). <li> Use html codes like \ä for an a with an umlaut (i.e. ä). See the HTML specification for the codes. @@ -230,17 +229,22 @@ the minimal number of translator adapter classes. <b>To simplify the maintenance of the language translator classes</b> for the supported languages, the \c translator.pl perl script was developed (located in \c doxygen/doc directory). -It is able to extract the important information about obsolete and -new methods from the source files for each of the languages -- see -the reference to the <em>translator report</em> ASCII file below -the table of supported languages shown earlier. Looking at the base -class of the language translator, the script guesses also the status -of the translator -- see the last column of the mentioned table. -The \c translator.pl is called automatically when the doxygen -documentation is generated. You can also run the script manualy -whenever you feel that it can help you. Of course, you are not -forced to use the results of the script. You can find the same -information by looking at the adapter class and its base classes. +It extracts the important information about obsolete and +new methods from the source files for each of the languages. +The information is stored in the <em>translator report</em> ASCII file +($translator_report_file_name). \htmlonly If you compiled this documentation +from sources and if you have also doxygen sources available the +link $translator_report_link should be valid.\endhtmlonly + +Looking at the base class of the language translator, the script +guesses also the status of the translator -- see the last column of +the table with languages above. The \c translator.pl is called +automatically when the doxygen documentation is generated. You can +also run the script manualy whenever you feel that it can help you. +Of course, you are not forced to use the results of the script. You +can find the same information by looking at the adapter class and +its base classes. + <b>How should I update my language translator?</b> Firstly, you should be the language maintainer, or you should let him/her know diff --git a/doc/maintainers.txt b/doc/maintainers.txt index c476fb5..7c60bcb 100644 --- a/doc/maintainers.txt +++ b/doc/maintainers.txt @@ -74,3 +74,5 @@ Swedish Samuel Häagglund: sahag96@nts.mh.se XeT Erixon: xet@hem.passagen.se +Ukrainian +Olexij Tkatchenko: olexij.tkatchenko@gmx.de diff --git a/doc/translator.pl b/doc/translator.pl index 9d44686..4c4bdac 100644 --- a/doc/translator.pl +++ b/doc/translator.pl @@ -26,7 +26,7 @@ # class for "almost up-to-date" translators. # - $doxygenrootdir and other global variables for storing # directories determined from DOXYGEN_DOCDIR environment -# variable. The change was done because the DOXYGEN_DOCDIR +# variable. The change was done because the DOXYGEN_DOCDIR # was already used before. # - $version mark can be used in the language.tpl template. # @@ -41,9 +41,23 @@ # 2001/06/11 # - Character entity č recognized in maintainers.txt. # +# 2001/07/17 +# - Perl version checking is less confusing now. The script stops +# immediately after the first command below when your perl +# is older that required. +# - The information below the table of languages is not produced +# with the table. Another symbol replacement is done, so language.tpl +# can be updated so that the generated language.doc does not contain +# the link to the translator_report.txt. +# +# Todo: +# ----- +# - Something changed. The environment variables like VERSION, +# DOXYGEN_DOCDIR are not set now when make is run. +# ################################################################ -require 5.005; +use 5.005; use strict; use Carp; @@ -561,9 +575,9 @@ xxxTABLE_FOOTxxx ##}}} # Finish the tables, and substitute the mark in the doc - # template by the contatenation of the tables and the notice - # about $ftranslatortxt. Add NOSPAM to email addresses in the - # HTML table. Replace the special character sequences. #{{{ + # template by the contatenation of the tables. Add NOSPAM to + # email addresses in the HTML table. Replace the special + # character sequences. #{{{ # $tableHTML .= $htmlTableFoot; $tableLATEX .= $latexTableFoot; @@ -580,14 +594,21 @@ xxxTABLE_FOOTxxx $tableLATEX =~ s/ř/\\v{r}/sg; $tableLATEX =~ s/_/\\_/sg; - my $notice = "\nHave a look at <a href=\"../doc/$ftranslatortxt\"\n>" - . "<code>doxygen/doc/$ftranslatortxt</code></a> " - . "for more details."; + $output =~ s{\$information_table}{$tableHTML$tableLATEX}; - $output =~ s{\$information_table}{$tableHTML$tableLATEX$notice}; + ##}}} + # Replace the other symbols in the template by the expected + # information. ##{{{ + # $output =~ s{\$version}{$doxversion}; + $output =~ s{\$translator_report_file_name} + {<code>doxygen/doc/$ftranslatortxt</code>}x; + + $output =~ s{\$translator_report_link} + {<a href=\"../doc/$ftranslatortxt\"> + <code>doxygen/doc/$ftranslatortxt</code></a>}x; ##}}} # Replace the introduction notice in the output. #{{{ @@ -624,6 +645,13 @@ xxxTABLE_FOOTxxx $srcdir = "$doxygenrootdir/src"; +=pod +# Show the environment variables (for debugging only). +# +foreach (sort keys %ENV) { print STDERR "$_=$ENV{$_}\n"; } +print STDERR "\n\n"; +=cut + $doxversion = (defined $ENV{'VERSION'}) ? $ENV{'VERSION'} : 'unknown'; ##}}} diff --git a/doc/translator_report.txt b/doc/translator_report.txt new file mode 100644 index 0000000..a815ed0 --- /dev/null +++ b/doc/translator_report.txt @@ -0,0 +1,1047 @@ +Doxygen supports the following (23) languages (sorted alphabetically): + + Brazilian + Chinese + Croatian + Czech + Danish + Dutch + English + Finnish + French + German + Hungarian + Italian + Japanese + Korean + Norwegian + Polish + Portuguese + Romanian + Russian + Slovak + Slovene + Spanish + Swedish + +---------------------------------------------------------------------- +The following translator classes are up-to-date (sorted alphabetically). +This means that they derive from the Translator class. If the translator +derives from TranslatorAdapterCVS, it is considered to be almost up-to-date. +In other words, it is newer than the last official release. Anyway, there +still may be some details listed even for the up-to-date translators. +Please, check the text below. + + TranslatorCroatian + TranslatorCzech + TranslatorDanish (TranslatorAdapterCVS) + TranslatorEnglish + TranslatorGerman + TranslatorItalian (TranslatorAdapterCVS) + TranslatorRussian + TranslatorSlovak (TranslatorAdapterCVS) + TranslatorSpanish (TranslatorAdapterCVS) + +---------------------------------------------------------------------- +The following translator classes are obsolete (sorted alphabetically). +This means that they derive from some of the adapter classes. + + TranslatorBrazilian (TranslatorAdapter_1_2_6) + TranslatorChinese (TranslatorAdapter_1_2_1) + TranslatorDutch (TranslatorAdapter_1_2_6) + TranslatorFinnish (TranslatorAdapter_1_0_0) + TranslatorFrench (TranslatorAdapter_1_2_0) + TranslatorHungarian (TranslatorAdapter_1_2_1) + TranslatorJapanese (TranslatorAdapter_1_2_5) + TranslatorKorean (TranslatorAdapter_1_1_0) + TranslatorNorwegian (TranslatorAdapter_1_2_2) + TranslatorPolish (TranslatorAdapter_1_2_1) + TranslatorPortuguese (TranslatorAdapter_1_1_5) + TranslatorRomanian (TranslatorAdapter_1_2_1) + TranslatorSlovene (TranslatorAdapter_1_1_5) + TranslatorSwedish (TranslatorAdapter_1_0_0) + + +---------------------------------------------------------------------- +Localized translators are expected to implement the following methods +(prototypes sorted aplhabetically): + +QCString idLanguage() +QCString idLanguageCharset() +QCString latexLanguageSupportCommand() +QCString trAlphabeticalList() +QCString trAttention() +QCString trAuthor(bool first_capital, bool singular) +QCString trBug() +QCString trBugList() +QCString trBugsAndLimitations() +QCString trClass(bool first_capital, bool singular) +QCString trClassDiagram(const char *clName) +QCString trClassDocumentation() +QCString trClassHierarchy() +QCString trClassHierarchyDescription() +QCString trClasses() +QCString trCode() +QCString trCollaborationDiagram(const char *clName) +QCString trCompoundIndex() +QCString trCompoundList() +QCString trCompoundListDescription() +QCString trCompoundMembers() +QCString trCompoundMembersDescription(bool extractAll) +QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool isTemplate) +QCString trCompounds() +QCString trConstructorDocumentation() +QCString trDCOPMethods() +QCString trDate() +QCString trDefineDocumentation() +QCString trDefineValue() +QCString trDefinedAtLineInSourceFile() +QCString trDefinedIn() +QCString trDefinedInSourceFile() +QCString trDefines() +QCString trDeprecated() +QCString trDetailedDescription() +QCString trDocumentation() +QCString trEnumName() +QCString trEnumValue() +QCString trEnumerationTypeDocumentation() +QCString trEnumerationValueDocumentation() +QCString trEnumerationValues() +QCString trEnumerations() +QCString trExampleDocumentation() +QCString trExamples() +QCString trExamplesDescription() +QCString trExceptions() +QCString trField(bool first_capital, bool singular) +QCString trFile(bool first_capital, bool singular) +QCString trFileDocumentation() +QCString trFileIndex() +QCString trFileList() +QCString trFileListDescription(bool extractAll) +QCString trFileMembers() +QCString trFileMembersDescription(bool extractAll) +QCString trFileReference(const char *fileName) +QCString trForInternalUseOnly() +QCString trFriends() +QCString trFuncProtos() +QCString trFunctionDocumentation() +QCString trFunctionPrototypeDocumentation() +QCString trFunctions() +QCString trGeneratedAt(const char *date,const char *projName) +QCString trGeneratedAutomatically(const char *s) +QCString trGeneratedBy() +QCString trGeneratedFromFiles(ClassDef::CompoundType compType, bool single) +QCString trGlobal(bool first_capital, bool singular) +QCString trGotoDocumentation() +QCString trGotoGraphicalHierarchy() +QCString trGotoSourceCode() +QCString trGotoTextualHierarchy() +QCString trGraphicalHierarchy() +QCString trGroup(bool first_capital, bool singular) +QCString trHeaderFiles() +QCString trHeaderFilesDescription() +QCString trHierarchicalIndex() +QCString trInclByDepGraph() +QCString trInclDepGraph(const char *fName) +QCString trIncludingInheritedMembers() +QCString trInheritedByList(int numEntries) +QCString trInheritsList(int numEntries) +QCString trInitialValue() +QCString trInterfaces() +QCString trInvariant() +QCString trLegend() +QCString trLegendDocs() +QCString trLegendTitle() +QCString trListOfAllMembers() +QCString trMainPage() +QCString trMember(bool first_capital, bool singular) +QCString trMemberDataDocumentation() +QCString trMemberEnumerationDocumentation() +QCString trMemberFunctionDocumentation() +QCString trMemberList() +QCString trMemberTypedefDocumentation() +QCString trModuleDocumentation() +QCString trModuleIndex() +QCString trModules() +QCString trModulesDescription() +QCString trMore() +QCString trNamespace(bool first_capital, bool singular) +QCString trNamespaceDocumentation() +QCString trNamespaceIndex() +QCString trNamespaceList() +QCString trNamespaceListDescription(bool extractAll) +QCString trNamespaceMemberDescription(bool extractAll) +QCString trNamespaceMembers() +QCString trNamespaceReference(const char *namespaceName) +QCString trNamespaces() +QCString trNoDescriptionAvailable() +QCString trNote() +QCString trPackage(const char *name) +QCString trPackageDocumentation() +QCString trPackageList() +QCString trPackageListDescription() +QCString trPackages() +QCString trPage(bool first_capital, bool singular) +QCString trPageAbbreviation() +QCString trPageDocumentation() +QCString trPageIndex() +QCString trParameters() +QCString trPostcondition() +QCString trPrecondition() +QCString trPrivateAttribs() +QCString trPrivateMembers() +QCString trPrivateSlots() +QCString trPrivateTypes() +QCString trProperties() +QCString trPropertyDocumentation() +QCString trProtectedAttribs() +QCString trProtectedMembers() +QCString trProtectedSlots() +QCString trProtectedTypes() +QCString trPublicAttribs() +QCString trPublicMembers() +QCString trPublicSlots() +QCString trPublicTypes() +QCString trRTFCharSet() +QCString trRTFGeneralIndex() +QCString trRTFansicp() +QCString trReferenceManual() +QCString trReferencedBy() +QCString trReimplementedForInternalReasons() +QCString trReimplementedFromList(int numEntries) +QCString trReimplementedInList(int numEntries) +QCString trRelatedFunctionDocumentation() +QCString trRelatedFunctions() +QCString trRelatedPages() +QCString trRelatedPagesDescription() +QCString trRelatedSubscript() +QCString trRemarks() +QCString trReturnValues() +QCString trReturns() +QCString trSearch() +QCString trSeeAlso() +QCString trSignals() +QCString trSince() +QCString trSources() +QCString trStaticPrivateAttribs() +QCString trStaticPrivateMembers() +QCString trStaticProtectedAttribs() +QCString trStaticProtectedMembers() +QCString trStaticPublicAttribs() +QCString trStaticPublicMembers() +QCString trTest() +QCString trTestList() +QCString trThisIsTheListOfAllMembers() +QCString trTodo() +QCString trTodoList() +QCString trTypedefDocumentation() +QCString trTypedefs() +QCString trVariableDocumentation() +QCString trVariables() +QCString trVersion() +QCString trWarning() +QCString trWriteList(int numEntries) +QCString trWrittenBy() + + +---------------------------------------------------------------------- +Details related to specific translator classes follows. +Notice that the prototypes are recognized only when they +are the same as in the Translator class. + + +TranslatorBrazilian (TranslatorAdapter_1_2_6) +------------------- + +Missing methods (should be implemented): + + QCString trRTFGeneralIndex() + QCString trPage(bool first_capital, bool singular) + QCString trFile(bool first_capital, bool singular) + QCString trGlobal(bool first_capital, bool singular) + QCString trField(bool first_capital, bool singular) + QCString trGroup(bool first_capital, bool singular) + QCString trRTFansicp() + QCString trNamespace(bool first_capital, bool singular) + QCString trClass(bool first_capital, bool singular) + QCString trRTFCharSet() + QCString trMember(bool first_capital, bool singular) + QCString trAuthor(bool first_capital, bool singular) + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trFiles() + QCString trVerbatimText(const char *f) + + + +TranslatorChinese (TranslatorAdapter_1_2_1) +----------------- + +Missing methods (should be implemented): + + QCString trRTFGeneralIndex() + QCString trPage(bool first_capital, bool singular) + QCString trPackageListDescription() + QCString trFile(bool first_capital, bool singular) + QCString trBug() + QCString trGlobal(bool first_capital, bool singular) + QCString trPackageList() + QCString trField(bool first_capital, bool singular) + QCString trGroup(bool first_capital, bool singular) + QCString trPackage(const char *name) + QCString trProperties() + QCString trBugList() + QCString trDCOPMethods() + QCString trPackageDocumentation() + QCString trRTFansicp() + QCString trNamespace(bool first_capital, bool singular) + QCString trPropertyDocumentation() + QCString trClass(bool first_capital, bool singular) + QCString trGeneratedFromFiles(ClassDef::CompoundType compType, bool single) + QCString trInterfaces() + QCString trRTFCharSet() + QCString latexLanguageSupportCommand() + QCString trPackages() + QCString trMember(bool first_capital, bool singular) + QCString trDefineValue() + QCString trAuthor(bool first_capital, bool singular) + QCString trClasses() + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trFiles() + QCString trGeneratedFromFiles(ClassDef::CompoundType compType, bool) + QCString trVerbatimText(const char *f) + + + +TranslatorGerman (Translator) +---------------- + +Missing methods (should be implemented): + + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool isTemplate) + QCString trPage(bool first_capital, bool singular) + QCString trFile(bool first_capital, bool singular) + QCString trField(bool first_capital, bool singular) + QCString trGroup(bool first_capital, bool singular) + QCString trNamespace(bool first_capital, bool singular) + QCString trClass(bool first_capital, bool singular) + QCString trMember(bool first_capital, bool singular) + QCString trAuthor(bool first_capital, bool singular) + +Obsolete methods (should be removed): + + QCString trAuthor(bool, bool singular) + QCString trClass(bool, bool singular) + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool ) + QCString trField(bool, bool singular) + QCString trFile(bool, bool singular) + QCString trGroup(bool, bool singular) + QCString trMember(bool, bool singular) + QCString trNamespace(bool, bool singular) + QCString trPage(bool, bool singular) + + + +TranslatorDanish (TranslatorAdapterCVS) +---------------- + +Missing methods (should be implemented): + + QCString trAuthor(bool first_capital, bool singular) + +Obsolete methods (should be removed): + + QCString trAuthor() + QCString trAuthors() + + + +TranslatorSpanish (TranslatorAdapterCVS) +----------------- + +Missing methods (should be implemented): + + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool isTemplate) + QCString trAuthor(bool first_capital, bool singular) + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool ) + QCString trFiles() + QCString trVerbatimText(const char *f) + + + +TranslatorFinnish (TranslatorAdapter_1_0_0) +----------------- + +Missing methods (should be implemented): + + QCString trGotoTextualHierarchy() + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool isTemplate) + QCString trRTFGeneralIndex() + QCString trSources() + QCString trPage(bool first_capital, bool singular) + QCString trPackageListDescription() + QCString trFile(bool first_capital, bool singular) + QCString trPrivateTypes() + QCString trDeprecated() + QCString trNote() + QCString trAlphabeticalList() + QCString trDefinedInSourceFile() + QCString trCode() + QCString trBug() + QCString trGlobal(bool first_capital, bool singular) + QCString trInitialValue() + QCString trPackageList() + QCString trField(bool first_capital, bool singular) + QCString trDefinedAtLineInSourceFile() + QCString trGroup(bool first_capital, bool singular) + QCString trPackage(const char *name) + QCString trProtectedTypes() + QCString trTest() + QCString trConstructorDocumentation() + QCString trProtectedAttribs() + QCString trProperties() + QCString trReferencedBy() + QCString trPrecondition() + QCString trPrivateAttribs() + QCString trRemarks() + QCString trTodo() + QCString trBugList() + QCString trDCOPMethods() + QCString trStaticPublicAttribs() + QCString trMainPage() + QCString trGotoGraphicalHierarchy() + QCString trPackageDocumentation() + QCString trRTFansicp() + QCString trPostcondition() + QCString trLegend() + QCString trPageAbbreviation() + QCString trPageIndex() + QCString trNamespace(bool first_capital, bool singular) + QCString trTestList() + QCString trCollaborationDiagram(const char *clName) + QCString trPropertyDocumentation() + QCString trClass(bool first_capital, bool singular) + QCString trInvariant() + QCString trTodoList() + QCString trPublicTypes() + QCString idLanguageCharset() + QCString trAttention() + QCString trGeneratedFromFiles(ClassDef::CompoundType compType, bool single) + QCString trInterfaces() + QCString trGotoSourceCode() + QCString trRTFCharSet() + QCString latexLanguageSupportCommand() + QCString trPackages() + QCString trNamespaces() + QCString trMember(bool first_capital, bool singular) + QCString trInclDepGraph(const char *fName) + QCString trDefineValue() + QCString trStaticProtectedAttribs() + QCString trInclByDepGraph() + QCString trReturnValues() + QCString trLegendTitle() + QCString trSince() + QCString trGotoDocumentation() + QCString trPublicAttribs() + QCString trLegendDocs() + QCString trStaticPrivateAttribs() + QCString trAuthor(bool first_capital, bool singular) + QCString trGraphicalHierarchy() + QCString trClasses() + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool ) + QCString trFiles() + QCString trGeneratedFrom(const char *s,bool single) + QCString trVerbatimText(const char *f) + + + +TranslatorFrench (TranslatorAdapter_1_2_0) +---------------- + +Missing methods (should be implemented): + + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool isTemplate) + QCString trRTFGeneralIndex() + QCString trPage(bool first_capital, bool singular) + QCString trPackageListDescription() + QCString trFile(bool first_capital, bool singular) + QCString trBug() + QCString trGlobal(bool first_capital, bool singular) + QCString trPackageList() + QCString trField(bool first_capital, bool singular) + QCString trGroup(bool first_capital, bool singular) + QCString trPackage(const char *name) + QCString trTest() + QCString trProperties() + QCString trBugList() + QCString trDCOPMethods() + QCString trPackageDocumentation() + QCString trRTFansicp() + QCString trNamespace(bool first_capital, bool singular) + QCString trTestList() + QCString trPropertyDocumentation() + QCString trClass(bool first_capital, bool singular) + QCString trInterfaces() + QCString trRTFCharSet() + QCString latexLanguageSupportCommand() + QCString trPackages() + QCString trMember(bool first_capital, bool singular) + QCString trDefineValue() + QCString trAuthor(bool first_capital, bool singular) + QCString trClasses() + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool ) + QCString trFiles() + QCString trIncludeFile() + QCString trVerbatimText(const char *f) + + + +TranslatorCroatian (Translator) +------------------ + +Missing methods (should be implemented): + + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool isTemplate) + +Obsolete methods (should be removed): + + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool ) + + + +TranslatorHungarian (TranslatorAdapter_1_2_1) +------------------- + +Missing methods (should be implemented): + + QCString trRTFGeneralIndex() + QCString trPage(bool first_capital, bool singular) + QCString trPackageListDescription() + QCString trFile(bool first_capital, bool singular) + QCString trBug() + QCString trGlobal(bool first_capital, bool singular) + QCString trPackageList() + QCString trField(bool first_capital, bool singular) + QCString trGroup(bool first_capital, bool singular) + QCString trPackage(const char *name) + QCString trProperties() + QCString trBugList() + QCString trDCOPMethods() + QCString trPackageDocumentation() + QCString trRTFansicp() + QCString trNamespace(bool first_capital, bool singular) + QCString trPropertyDocumentation() + QCString trClass(bool first_capital, bool singular) + QCString trInterfaces() + QCString trRTFCharSet() + QCString trPackages() + QCString trMember(bool first_capital, bool singular) + QCString trDefineValue() + QCString trAuthor(bool first_capital, bool singular) + QCString trClasses() + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trFiles() + QCString trVerbatimText(const char *f) + + + +TranslatorItalian (TranslatorAdapterCVS) +----------------- + +Missing methods (should be implemented): + + QCString trFile(bool first_capital, bool singular) + QCString trNamespace(bool first_capital, bool singular) + QCString trAuthor(bool first_capital, bool singular) + +Obsolete methods (should be removed): + + QCString trAuthor() + QCString trAuthors() + QCString trFile(bool first_capital, bool) + QCString trFiles() + QCString trNamespace(bool first_capital, bool) + QCString trVerbatimText(const char *f) + + + +TranslatorJapanese (TranslatorAdapter_1_2_5) +------------------ + +Missing methods (should be implemented): + + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool isTemplate) + QCString trRTFGeneralIndex() + QCString trPage(bool first_capital, bool singular) + QCString trFile(bool first_capital, bool singular) + QCString trBug() + QCString trGlobal(bool first_capital, bool singular) + QCString trField(bool first_capital, bool singular) + QCString trGroup(bool first_capital, bool singular) + QCString trBugList() + QCString trRTFansicp() + QCString trNamespace(bool first_capital, bool singular) + QCString trClass(bool first_capital, bool singular) + QCString trGeneratedFromFiles(ClassDef::CompoundType compType, bool single) + QCString trRTFCharSet() + QCString latexLanguageSupportCommand() + QCString trMember(bool first_capital, bool singular) + QCString trAuthor(bool first_capital, bool singular) + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool ) + QCString trFiles() + QCString trGeneratedFromFiles(ClassDef::CompoundType compType, bool) + QCString trVerbatimText(const char *f) + + + +TranslatorKorean (TranslatorAdapter_1_1_0) +---------------- + +Missing methods (should be implemented): + + QCString trRTFGeneralIndex() + QCString trPage(bool first_capital, bool singular) + QCString trPackageListDescription() + QCString trFile(bool first_capital, bool singular) + QCString trPrivateTypes() + QCString trNote() + QCString trBug() + QCString trGlobal(bool first_capital, bool singular) + QCString trPackageList() + QCString trField(bool first_capital, bool singular) + QCString trGroup(bool first_capital, bool singular) + QCString trPackage(const char *name) + QCString trProtectedTypes() + QCString trTest() + QCString trProtectedAttribs() + QCString trProperties() + QCString trReferencedBy() + QCString trPrivateAttribs() + QCString trRemarks() + QCString trTodo() + QCString trBugList() + QCString trDCOPMethods() + QCString trStaticPublicAttribs() + QCString trPackageDocumentation() + QCString trRTFansicp() + QCString trLegend() + QCString trNamespace(bool first_capital, bool singular) + QCString trTestList() + QCString trPropertyDocumentation() + QCString trClass(bool first_capital, bool singular) + QCString trTodoList() + QCString trPublicTypes() + QCString trAttention() + QCString trInterfaces() + QCString trRTFCharSet() + QCString latexLanguageSupportCommand() + QCString trPackages() + QCString trMember(bool first_capital, bool singular) + QCString trDefineValue() + QCString trStaticProtectedAttribs() + QCString trInclByDepGraph() + QCString trLegendTitle() + QCString trSince() + QCString trPublicAttribs() + QCString trLegendDocs() + QCString trStaticPrivateAttribs() + QCString trAuthor(bool first_capital, bool singular) + QCString trClasses() + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trFiles() + QCString trVerbatimText(const char *f) + + + +TranslatorDutch (TranslatorAdapter_1_2_6) +--------------- + +Missing methods (should be implemented): + + QCString trRTFGeneralIndex() + QCString trPage(bool first_capital, bool singular) + QCString trFile(bool first_capital, bool singular) + QCString trGlobal(bool first_capital, bool singular) + QCString trField(bool first_capital, bool singular) + QCString trGroup(bool first_capital, bool singular) + QCString trRTFansicp() + QCString trNamespace(bool first_capital, bool singular) + QCString trClass(bool first_capital, bool singular) + QCString idLanguageCharset() + QCString trRTFCharSet() + QCString latexLanguageSupportCommand() + QCString trMember(bool first_capital, bool singular) + QCString trAuthor(bool first_capital, bool singular) + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trFiles() + QCString trVerbatimText(const char *f) + + + +TranslatorNorwegian (TranslatorAdapter_1_2_2) +------------------- + +Missing methods (should be implemented): + + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool isTemplate) + QCString trRTFGeneralIndex() + QCString trPage(bool first_capital, bool singular) + QCString trPackageListDescription() + QCString trFile(bool first_capital, bool singular) + QCString trBug() + QCString trGlobal(bool first_capital, bool singular) + QCString trPackageList() + QCString trField(bool first_capital, bool singular) + QCString trGroup(bool first_capital, bool singular) + QCString trPackage(const char *name) + QCString trProperties() + QCString trBugList() + QCString trPackageDocumentation() + QCString trRTFansicp() + QCString trNamespace(bool first_capital, bool singular) + QCString trPropertyDocumentation() + QCString trClass(bool first_capital, bool singular) + QCString idLanguageCharset() + QCString trInterfaces() + QCString trRTFCharSet() + QCString latexLanguageSupportCommand() + QCString trPackages() + QCString trMember(bool first_capital, bool singular) + QCString trDefineValue() + QCString trAuthor(bool first_capital, bool singular) + QCString trClasses() + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool ) + QCString trFiles() + QCString trVerbatimText(const char *f) + + + +TranslatorPolish (TranslatorAdapter_1_2_1) +---------------- + +Missing methods (should be implemented): + + QCString trRTFGeneralIndex() + QCString trPage(bool first_capital, bool singular) + QCString trPackageListDescription() + QCString trFile(bool first_capital, bool singular) + QCString trBug() + QCString trGlobal(bool first_capital, bool singular) + QCString trPackageList() + QCString trField(bool first_capital, bool singular) + QCString trGroup(bool first_capital, bool singular) + QCString trPackage(const char *name) + QCString trProperties() + QCString trBugList() + QCString trDCOPMethods() + QCString trPackageDocumentation() + QCString trRTFansicp() + QCString trNamespace(bool first_capital, bool singular) + QCString trPropertyDocumentation() + QCString trClass(bool first_capital, bool singular) + QCString idLanguageCharset() + QCString trInterfaces() + QCString trRTFCharSet() + QCString trPackages() + QCString trMember(bool first_capital, bool singular) + QCString trDefineValue() + QCString trAuthor(bool first_capital, bool singular) + QCString trClasses() + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trFiles() + QCString trVerbatimText(const char *f) + + + +TranslatorPortuguese (TranslatorAdapter_1_1_5) +-------------------- + +Missing methods (should be implemented): + + QCString trRTFGeneralIndex() + QCString trPage(bool first_capital, bool singular) + QCString trPackageListDescription() + QCString trFile(bool first_capital, bool singular) + QCString trBug() + QCString trGlobal(bool first_capital, bool singular) + QCString trPackageList() + QCString trField(bool first_capital, bool singular) + QCString trGroup(bool first_capital, bool singular) + QCString trPackage(const char *name) + QCString trTest() + QCString trProperties() + QCString trBugList() + QCString trDCOPMethods() + QCString trPackageDocumentation() + QCString trRTFansicp() + QCString trLegend() + QCString trNamespace(bool first_capital, bool singular) + QCString trTestList() + QCString trPropertyDocumentation() + QCString trClass(bool first_capital, bool singular) + QCString idLanguageCharset() + QCString trInterfaces() + QCString trRTFCharSet() + QCString latexLanguageSupportCommand() + QCString trPackages() + QCString trMember(bool first_capital, bool singular) + QCString trDefineValue() + QCString trLegendTitle() + QCString trLegendDocs() + QCString trAuthor(bool first_capital, bool singular) + QCString trClasses() + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trFiles() + QCString trIncludeFile() + QCString trVerbatimText(const char *f) + + + +TranslatorRomanian (TranslatorAdapter_1_2_1) +------------------ + +Missing methods (should be implemented): + + QCString trRTFGeneralIndex() + QCString trPage(bool first_capital, bool singular) + QCString trPackageListDescription() + QCString trFile(bool first_capital, bool singular) + QCString trBug() + QCString trGlobal(bool first_capital, bool singular) + QCString trPackageList() + QCString trField(bool first_capital, bool singular) + QCString trGroup(bool first_capital, bool singular) + QCString trPackage(const char *name) + QCString trProperties() + QCString trBugList() + QCString trDCOPMethods() + QCString trPackageDocumentation() + QCString trRTFansicp() + QCString trNamespace(bool first_capital, bool singular) + QCString trPropertyDocumentation() + QCString trClass(bool first_capital, bool singular) + QCString trInterfaces() + QCString trRTFCharSet() + QCString trPackages() + QCString trMember(bool first_capital, bool singular) + QCString trDefineValue() + QCString trAuthor(bool first_capital, bool singular) + QCString trClasses() + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trFiles() + QCString trVerbatimText(const char *f) + + + +TranslatorSwedish (TranslatorAdapter_1_0_0) +----------------- + +Missing methods (should be implemented): + + QCString trGotoTextualHierarchy() + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool isTemplate) + QCString trRTFGeneralIndex() + QCString trPage(bool first_capital, bool singular) + QCString trPackageListDescription() + QCString trFile(bool first_capital, bool singular) + QCString trPrivateTypes() + QCString trDeprecated() + QCString trNote() + QCString trCode() + QCString trBug() + QCString trGlobal(bool first_capital, bool singular) + QCString trInitialValue() + QCString trPackageList() + QCString trField(bool first_capital, bool singular) + QCString trGroup(bool first_capital, bool singular) + QCString trPackage(const char *name) + QCString trProtectedTypes() + QCString trTest() + QCString trConstructorDocumentation() + QCString trProtectedAttribs() + QCString trProperties() + QCString trReferencedBy() + QCString trPrecondition() + QCString trPrivateAttribs() + QCString trRemarks() + QCString trTodo() + QCString trBugList() + QCString trDCOPMethods() + QCString trStaticPublicAttribs() + QCString trGotoGraphicalHierarchy() + QCString trPackageDocumentation() + QCString trRTFansicp() + QCString trPostcondition() + QCString trLegend() + QCString trPageIndex() + QCString trNamespace(bool first_capital, bool singular) + QCString trTestList() + QCString trCollaborationDiagram(const char *clName) + QCString trPropertyDocumentation() + QCString trClass(bool first_capital, bool singular) + QCString trInvariant() + QCString trTodoList() + QCString trPublicTypes() + QCString idLanguageCharset() + QCString trAttention() + QCString trInterfaces() + QCString trGotoSourceCode() + QCString trRTFCharSet() + QCString latexLanguageSupportCommand() + QCString trPackages() + QCString trMember(bool first_capital, bool singular) + QCString trInclDepGraph(const char *fName) + QCString trDefineValue() + QCString trStaticProtectedAttribs() + QCString trInclByDepGraph() + QCString trLegendTitle() + QCString trSince() + QCString trGotoDocumentation() + QCString trPublicAttribs() + QCString trLegendDocs() + QCString trStaticPrivateAttribs() + QCString trAuthor(bool first_capital, bool singular) + QCString trGraphicalHierarchy() + QCString trClasses() + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool ) + QCString trFiles() + QCString trVerbatimText(const char *f) + + + +TranslatorSlovene (TranslatorAdapter_1_1_5) +----------------- + +Missing methods (should be implemented): + + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool isTemplate) + QCString trRTFGeneralIndex() + QCString trPage(bool first_capital, bool singular) + QCString trPackageListDescription() + QCString trFile(bool first_capital, bool singular) + QCString trBug() + QCString trGlobal(bool first_capital, bool singular) + QCString trPackageList() + QCString trField(bool first_capital, bool singular) + QCString trGroup(bool first_capital, bool singular) + QCString trPackage(const char *name) + QCString trTest() + QCString trProperties() + QCString trBugList() + QCString trDCOPMethods() + QCString trPackageDocumentation() + QCString trRTFansicp() + QCString trLegend() + QCString trNamespace(bool first_capital, bool singular) + QCString trTestList() + QCString trPropertyDocumentation() + QCString trClass(bool first_capital, bool singular) + QCString trInterfaces() + QCString trRTFCharSet() + QCString trPackages() + QCString trMember(bool first_capital, bool singular) + QCString trDefineValue() + QCString trLegendTitle() + QCString trLegendDocs() + QCString trAuthor(bool first_capital, bool singular) + QCString trClasses() + +Obsolete methods (should be removed): + + QCString latexBabelPackage() + QCString trAuthor() + QCString trAuthors() + QCString trCompoundReference(const char *clName, ClassDef::CompoundType compType, bool ) + QCString trFiles() + QCString trVerbatimText(const char *f) + + + +TranslatorSlovak (TranslatorAdapterCVS) +---------------- + +Missing methods (should be implemented): + + QCString trAuthor(bool first_capital, bool singular) + +Obsolete methods (should be removed): + + QCString trAuthor() + QCString trAuthors() + QCString trFiles() + diff --git a/examples/example.tag b/examples/example.tag index b4eaef9..84ef9ed 100644 --- a/examples/example.tag +++ b/examples/example.tag @@ -3,6 +3,7 @@ <name>Test</name> <filename>class_test.html</filename> <member kind="function"> + <type>void</type> <name>example</name> <anchor>a0</anchor> <arglist>()</arglist> diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec index 34789a5..b0df409 100644 --- a/packages/rpm/doxygen.spec +++ b/packages/rpm/doxygen.spec @@ -1,5 +1,5 @@ Name: doxygen -Version: 1.2.8_20010715 +Version: 1.2.8_20010723 Summary: documentation system for C, C++ and IDL Release: 3 Source: doxygen-%{version}.src.tar.gz diff --git a/src/classdef.cpp b/src/classdef.cpp index f7c0550..6dbc086 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -127,15 +127,11 @@ QCString ClassDef::displayName() const QCString n; if (Config_getBool("HIDE_SCOPE_NAMES")) { - n=stripScope(name()); + n=localName(); } else { - n=name(); - } - if (m_tempArgs) - { - n+=tempArgListToString(m_tempArgs); + n=qualifiedNameWithTemplateParameters(); } return n; } @@ -603,32 +599,70 @@ ArgumentList *ClassDef::outerTemplateArguments() const return 0; } +static void searchTemplateSpecs(/*in*/ Definition *d, + /*out*/ QList<ArgumentList> &result, + /*out*/ QCString &name) +{ + if (d->definitionType()==Definition::TypeClass) + { + if (d->getOuterScope()) + { + searchTemplateSpecs(d->getOuterScope(),result,name); + } + ClassDef *cd=(ClassDef *)d; + if (!name.isEmpty()) name+="::"; + name+=d->localName(); + bool isSpecialization = d->localName().find('<')!=-1; + if (cd->templateArguments()) + { + result.append(cd->templateArguments()); + if (!isSpecialization) + { + name+=tempArgListToString(cd->templateArguments()); + } + } + } + else + { + name+=d->qualifiedName(); + } +} -static void writeTemplateSpec(OutputList &ol,ArgumentList *al, - const QCString &pageType,const QCString &name) +static void writeTemplateSpec(OutputList &ol,Definition *d, + const QCString &type) { - if (al) // class is a template + QList<ArgumentList> specs; + QCString name; + searchTemplateSpecs(d,specs,name); + if (specs.count()>0) // class has template scope specifiers { ol.startSubsubsection(); - ol.docify("template<"); - Argument *a=al->first(); - while (a) + QListIterator<ArgumentList> spi(specs); + ArgumentList *al; + for (spi.toFirst();(al=spi.current());++spi) { - ol.docify(a->type); - if (!a->name.isEmpty()) + ol.docify("template<"); + Argument *a=al->first(); + while (a) { - ol.docify(" "); - ol.docify(a->name); + ol.docify(a->type); + if (!a->name.isEmpty()) + { + ol.docify(" "); + ol.docify(a->name); + } + if (a->defval.length()!=0) + { + ol.docify(" = "); + ol.docify(a->defval); + } + a=al->next(); + if (a) ol.docify(", "); } - if (a->defval.length()!=0) - { - ol.docify(" = "); - ol.docify(a->defval); - } - a=al->next(); - if (a) ol.docify(", "); + ol.docify(">"); + ol.lineBreak(); } - ol.docify("> "+pageType.lower()+" "+name); + ol.docify(type.lower()+" "+name); ol.endSubsubsection(); ol.writeString("\n"); } @@ -735,7 +769,7 @@ void ClassDef::writeDocumentation(OutputList &ol) if (Config_getBool("CLASS_DIAGRAMS")) ol.disableAllBut(OutputGenerator::Man); - // write subclasses + // write super classes int count; if ((count=m_inherits->count())>0) { @@ -1005,7 +1039,7 @@ void ClassDef::writeDocumentation(OutputList &ol) ol.endGroupHeader(); ol.startTextBlock(); - writeTemplateSpec(ol,outerTempArgList,pageType,name()); + writeTemplateSpec(ol,this,pageType); // repeat brief description if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) @@ -1046,8 +1080,10 @@ void ClassDef::writeDocumentation(OutputList &ol) } else { - writeTemplateSpec(ol,outerTempArgList,pageType,name()); + writeTemplateSpec(ol,this,pageType); } + + typedefMembers.writeDocumentation(ol,name(),this, theTranslator->trMemberTypedefDocumentation()); @@ -1140,6 +1176,20 @@ void ClassDef::writeDocumentation(OutputList &ol) } endFile(ol); + + + // write inner classes after the parent, so the tag files contain + // the definition in proper order! + if (m_innerClasses) + { + ClassSDict::Iterator cli(*m_innerClasses); + ClassDef *innerCd; + for (cli.toFirst();(innerCd=cli.current());++cli) + { + msg("Generating docs for nested compound %s...\n",innerCd->name().data()); + innerCd->writeDocumentation(ol); + } + } } // write the list of all (inherited) members for this class @@ -2062,6 +2112,7 @@ ClassDef *ClassDef::insertTemplateInstance(const QCString &fileName, //templateClass->setBriefDescription(briefDescription()); //templateClass->setDocumentation(documentation()); templateClass->setTemplateMaster(this); + templateClass->setOuterScope(getOuterScope()); m_templateInstances->insert(templSpec,templateClass); freshInstance=TRUE; } @@ -2149,3 +2200,64 @@ QCString ClassDef::getReference() const } } +void ClassDef::getTemplateParameterLists(QList<ArgumentList> &lists) const +{ + Definition *d=getOuterScope(); + if (d) + { + if (d->definitionType()==Definition::TypeClass) + { + ClassDef *cd=(ClassDef *)d; + cd->getTemplateParameterLists(lists); + } + } + if (templateArguments()) + { + lists.append(templateArguments()); + } +} + +QCString ClassDef::qualifiedNameWithTemplateParameters( + QList<ArgumentList> *actualParams) const +{ + QCString scName; + Definition *d=getOuterScope(); + if (d) + { + if (d->definitionType()==Definition::TypeClass) + { + ClassDef *cd=(ClassDef *)d; + scName = cd->qualifiedNameWithTemplateParameters(actualParams); + } + else + { + scName = d->qualifiedName(); + } + } + if (!scName.isEmpty()) scName+="::"; + scName+=localName(); + ArgumentList *al=0; + bool isSpecialization = localName().find('<')!=-1; + if (templateArguments()) + { + if (actualParams && (al=actualParams->current())) + { + if (!isSpecialization) + { + scName+=tempArgListToString(al); + } + actualParams->next(); + } + else + { + if (!isSpecialization) + { + scName+=tempArgListToString(templateArguments()); + } + } + } + //printf("scope=%s qualifiedName=%s\n",name().data(),scName.data()); + return scName; +} + + diff --git a/src/classdef.h b/src/classdef.h index 323b7bd..e662152 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -184,6 +184,16 @@ class ClassDef : public Definition */ virtual Definition *findInnerCompound(const char *name); + /*! Returns the template parameter lists that form the template + * declaration of this class. + * + * Example: <code>template<class T> class TC {};</code> + * will return a list with one ArgumentList containing one argument + * with type="class" and name="T". + */ + void getTemplateParameterLists(QList<ArgumentList> &lists) const; + QCString qualifiedNameWithTemplateParameters( + QList<ArgumentList> *actualParams=0) const; /* member lists by protection */ MemberList pubMembers; diff --git a/src/config.h b/src/config.h index 02a3389..4b00d22 100644 --- a/src/config.h +++ b/src/config.h @@ -307,6 +307,7 @@ class ConfigBool : public ConfigOption QCString m_valueString; }; +// some convenience macros #define Config_getString(val) Config::instance()->getString(__FILE__,__LINE__,val) #define Config_getInt(val) Config::instance()->getInt(__FILE__,__LINE__,val) #define Config_getList(val) Config::instance()->getList(__FILE__,__LINE__,val) @@ -319,6 +320,10 @@ class ConfigBool : public ConfigOption * read from a user-supplied configuration file. * The static member instance() can be used to get * a pointer to the one and only instance. + * + * Set all variables to their default values by + * calling Config::instance()->init() + * */ class Config { @@ -479,11 +484,34 @@ class Config // internal API ///////////////////////////// + /*! Converts the string values read from the configuration file + * to real values for non-string type options (like int, and bools) + */ void convertStrToVal(); + + /*! Replaces references to environment variable by the actual value + * of the environment variable. + */ void substituteEnvironmentVars(); + + /*! Checks if the values of the variable are correct, adjusts them + * if needed, and report any errors. + */ void check(); + + /*! Initialize config variables to their default value */ void init(); - void parse(const QCString &config,const char *fn); + + /*! Parse a configuration file with name \a fn. + * \returns TRUE if successful, FALSE if the file could not be + * opened or read. + */ + bool parse(const char *fn); + + /*! Called from the constructor, will add doxygen's default options + * to the configuration object + */ + void create(); protected: Config() { @@ -498,7 +526,6 @@ class Config delete m_options; delete m_dict; } - void create(); private: QList<ConfigOption> *m_options; diff --git a/src/config.l b/src/config.l index 9ffdf55..583195c 100644 --- a/src/config.l +++ b/src/config.l @@ -22,6 +22,7 @@ //#include <iostream.h> #include <assert.h> #include <ctype.h> +#include <stdarg.h> #include <qfileinfo.h> #include <qdir.h> @@ -31,33 +32,34 @@ #include "config.h" #include "version.h" + +#undef Config_getString +#undef Config_getInt +#undef Config_getList +#undef Config_getEnum +#undef Config_getBool + +// use in-class definitions +#define Config_getString(val) getString(__FILE__,__LINE__,val) +#define Config_getInt(val) getInt(__FILE__,__LINE__,val) +#define Config_getList(val) getList(__FILE__,__LINE__,val) +#define Config_getEnum(val) getEnum(__FILE__,__LINE__,val) +#define Config_getBool(val) getBool(__FILE__,__LINE__,val) -#ifdef DOXYWIZARD -#include <stdarg.h> -void err(const char *fmt, ...) +void config_err(const char *fmt, ...) { va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); } -void warn_cont(const char *fmt, ...) +void config_warn(const char *fmt, ...) { va_list args; va_start(args, fmt); vfprintf(stderr, fmt, args); va_end(args); } -void initWarningFormat() -{ -} -#else -#include "doxygen.h" -#include "message.h" -#include "pre.h" -#include "version.h" -#include "language.h" -#endif #define MAX_INCLUDE_DEPTH 10 #define YY_NEVER_INTERACTIVE 1 @@ -142,7 +144,7 @@ void ConfigInt::convertStrToVal() int val = m_valueString.toInt(&ok); if (!ok || val<m_minVal || val>m_maxVal) { - warn_cont("Warning: argument `%s' for option %s is not a valid number in the range [%d..%d]!\n" + config_warn("Warning: argument `%s' for option %s is not a valid number in the range [%d..%d]!\n" "Using the default: %d!\n",m_valueString.data(),m_name.data(),m_minVal,m_maxVal,m_value); } m_value=val; @@ -164,7 +166,7 @@ void ConfigBool::convertStrToVal() } else { - warn_cont("Warning: argument `%s' for option %s is not a valid boolean value\n" + config_warn("Warning: argument `%s' for option %s is not a valid boolean value\n" "Using the default: %s!\n",m_valueString.data(),m_name.data(),m_value?"YES":"NO"); } } @@ -175,12 +177,12 @@ QCString &Config::getString(const char *fileName,int num,const char *name) const ConfigOption *opt = m_dict->find(name); if (opt==0) { - err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name); + config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name); exit(1); } else if (opt->kind()!=ConfigOption::O_String) { - err("%s<%d>: Internal error: Requested option %s not of string type!\n",fileName,num,name); + config_err("%s<%d>: Internal error: Requested option %s not of string type!\n",fileName,num,name); exit(1); } return *((ConfigString *)opt)->valueRef(); @@ -191,12 +193,12 @@ QStrList &Config::getList(const char *fileName,int num,const char *name) const ConfigOption *opt = m_dict->find(name); if (opt==0) { - err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name); + config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name); exit(1); } else if (opt->kind()!=ConfigOption::O_List) { - err("%d<%d>: Internal error: Requested option %s not of list type!\n",fileName,num,name); + config_err("%d<%d>: Internal error: Requested option %s not of list type!\n",fileName,num,name); exit(1); } return *((ConfigList *)opt)->valueRef(); @@ -207,12 +209,12 @@ QCString &Config::getEnum(const char *fileName,int num,const char *name) const ConfigOption *opt = m_dict->find(name); if (opt==0) { - err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name); + config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name); exit(1); } else if (opt->kind()!=ConfigOption::O_Enum) { - err("%s<%d>: Internal error: Requested option %s not of enum type!\n",fileName,num,name); + config_err("%s<%d>: Internal error: Requested option %s not of enum type!\n",fileName,num,name); exit(1); } return *((ConfigEnum *)opt)->valueRef(); @@ -223,12 +225,12 @@ int &Config::getInt(const char *fileName,int num,const char *name) const ConfigOption *opt = m_dict->find(name); if (opt==0) { - err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name); + config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name); exit(1); } else if (opt->kind()!=ConfigOption::O_Int) { - err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name); + config_err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name); exit(1); } return *((ConfigInt *)opt)->valueRef(); @@ -239,12 +241,12 @@ bool &Config::getBool(const char *fileName,int num,const char *name) const ConfigOption *opt = m_dict->find(name); if (opt==0) { - err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name); + config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name); exit(1); } else if (opt->kind()!=ConfigOption::O_Bool) { - err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name); + config_err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name); exit(1); } return *((ConfigBool *)opt)->valueRef(); @@ -322,7 +324,7 @@ static FILE *tryPath(const char *path,const char *fileName) if (fi.exists() && fi.isFile()) { FILE *f=fopen(absName,"r"); - if (!f) err("Error: could not open file %s for reading\n",absName.data()); + if (!f) config_err("Error: could not open file %s for reading\n",absName.data()); return f; } return 0; @@ -348,7 +350,7 @@ static FILE *findFile(const char *fileName) static void readIncludeFile(const char *incName) { if (includeDepth==MAX_INCLUDE_DEPTH) { - err("Error: maximum include depth (%d) reached, %s is not included. Aborting...\n", + config_err("Error: maximum include depth (%d) reached, %s is not included. Aborting...\n", MAX_INCLUDE_DEPTH,incName); exit(1); } @@ -389,7 +391,7 @@ static void readIncludeFile(const char *incName) } else { - err("Error: @INCLUDE = %s: not found!\n",inc.data()); + config_err("Error: @INCLUDE = %s: not found!\n",inc.data()); exit(1); } } @@ -418,7 +420,7 @@ static void readIncludeFile(const char *incName) ConfigOption *option = config->get(cmd); if (option==0) // oops not known { - err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n", + config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n", yytext,yyLineNr,yyFileName.data()); BEGIN(SkipInvalid); } @@ -464,7 +466,7 @@ static void readIncludeFile(const char *incName) ConfigOption *option = config->get(cmd); if (option==0) // oops not known { - err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n", + config_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n", yytext,yyLineNr,yyFileName.data()); BEGIN(SkipInvalid); } @@ -485,7 +487,7 @@ static void readIncludeFile(const char *incName) case ConfigOption::O_String: case ConfigOption::O_Int: case ConfigOption::O_Bool: - err("Warning: operator += not supported for `%s'. Ignoring line at line %d, file %s\n", + config_err("Warning: operator += not supported for `%s'. Ignoring line at line %d, file %s\n", yytext,yyLineNr,yyFileName.data()); BEGIN(SkipInvalid); break; @@ -521,7 +523,7 @@ static void readIncludeFile(const char *incName) } } -<Start>[a-z_A-Z0-9]+ { err("Warning: ignoring unknown tag `%s' at line %d, file %s\n",yytext,yyLineNr,yyFileName.data()); } +<Start>[a-z_A-Z0-9]+ { config_err("Warning: ignoring unknown tag `%s' at line %d, file %s\n",yytext,yyLineNr,yyFileName.data()); } <GetString,GetBool,SkipInvalid>\n { yyLineNr++; BEGIN(Start); } <GetStrList>\n { yyLineNr++; @@ -553,7 +555,7 @@ static void readIncludeFile(const char *incName) elemStr+=tmpString; if (*yytext=='\n') { - err("Warning: Missing end quote (\") on line %d, file %s\n",yyLineNr,yyFileName.data()); + config_err("Warning: Missing end quote (\") on line %d, file %s\n",yyLineNr,yyFileName.data()); yyLineNr++; } BEGIN(lastState); @@ -572,7 +574,7 @@ static void readIncludeFile(const char *incName) else { *b=FALSE; - warn_cont("Warning: Invalid value `%s' for " + config_warn("Warning: Invalid value `%s' for " "boolean tag in line %d, file %s; use YES or NO\n", bs.data(),yyLineNr,yyFileName.data()); } @@ -639,11 +641,7 @@ static void writeStringList(QTextStream &t,QStrList &l) void Config::writeTemplate(QFile *f,bool sl,bool upd) { QTextStream t(f); -#ifdef DOXYWIZARD - t << "# Doxygen configuration generated by Doxywizard version " << versionString << endl; -#else t << "# Doxyfile " << versionString << endl << endl; -#endif if (!sl) { t << "# This file describes the settings to be used by the documentation system\n"; @@ -814,7 +812,7 @@ void Config::check() // projectName[0]=toupper(projectName[0]); //} - QCString &warnFormat = getString(__FILE__,__LINE__,"WARN_FORMAT"); + QCString &warnFormat = Config_getString("WARN_FORMAT"); if (warnFormat.isEmpty()) { warnFormat="$file:$line $text"; @@ -823,23 +821,22 @@ void Config::check() { if (warnFormat.find("$file")==-1) { - err("Error: warning format does not contain a $file tag!\n"); + config_err("Error: warning format does not contain a $file tag!\n"); exit(1); } if (warnFormat.find("$line")==-1) { - err("Error: warning format does not contain a $line tag!\n"); + config_err("Error: warning format does not contain a $line tag!\n"); exit(1); } if (warnFormat.find("$text")==-1) { - err("Error: wanring format foes not contain a $text tag!\n"); + config_err("Error: wanring format foes not contain a $text tag!\n"); exit(1); } } - initWarningFormat(); - QCString &manExtension = getString(__FILE__,__LINE__,"MAN_EXTENSION"); + QCString &manExtension = Config_getString("MAN_EXTENSION"); // set default man page extension if non is given by the user if (manExtension.isEmpty()) @@ -847,7 +844,7 @@ void Config::check() manExtension=".3"; } - QCString &paperType = getEnum(__FILE__,__LINE__,"PAPER_TYPE"); + QCString &paperType = Config_getEnum("PAPER_TYPE"); paperType=paperType.lower().stripWhiteSpace(); if (paperType.isEmpty()) { @@ -856,31 +853,18 @@ void Config::check() if (paperType!="a4" && paperType!="a4wide" && paperType!="letter" && paperType!="legal" && paperType!="executive") { - err("Error: Unknown page type specified"); + config_err("Error: Unknown page type specified"); } - QCString &outputLanguage=getEnum(__FILE__,__LINE__,"OUTPUT_LANGUAGE"); + QCString &outputLanguage=Config_getEnum("OUTPUT_LANGUAGE"); outputLanguage=outputLanguage.stripWhiteSpace(); if (outputLanguage.isEmpty()) { outputLanguage = "English"; -#ifndef DOXYWIZARD - setTranslator("English"); -#endif - } - else - { -#ifndef DOXYWIZARD - if (!setTranslator(outputLanguage)) - { - err("Error: Output language %s not supported! Using English instead.\n", - outputLanguage.data()); - } -#endif } // expand the relative stripFromPath values - QStrList &stripFromPath = getList(__FILE__,__LINE__,"STRIP_FROM_PATH"); + QStrList &stripFromPath = Config_getList("STRIP_FROM_PATH"); char *sfp = stripFromPath.first(); while (sfp) { @@ -903,57 +887,54 @@ void Config::check() // Test to see if HTML header is valid - QCString &headerFile = getString(__FILE__,__LINE__,"HTML_HEADER"); + QCString &headerFile = Config_getString("HTML_HEADER"); if (!headerFile.isEmpty()) { QFileInfo fi(headerFile); if (!fi.exists()) { - err("Error: tag HTML_HEADER: header file `%s' " + config_err("Error: tag HTML_HEADER: header file `%s' " "does not exist\n",headerFile.data()); exit(1); } } // Test to see if HTML footer is valid - QCString &footerFile = getString(__FILE__,__LINE__,"HTML_FOOTER"); + QCString &footerFile = Config_getString("HTML_FOOTER"); if (!footerFile.isEmpty()) { QFileInfo fi(footerFile); if (!fi.exists()) { - err("Error: tag HTML_FOOTER: footer file `%s' " + config_err("Error: tag HTML_FOOTER: footer file `%s' " "does not exist\n",footerFile.data()); exit(1); } } // Test to see if LaTeX header is valid - QCString &latexHeaderFile = getString(__FILE__,__LINE__,"LATEX_HEADER"); + QCString &latexHeaderFile = Config_getString("LATEX_HEADER"); if (!latexHeaderFile.isEmpty()) { QFileInfo fi(latexHeaderFile); if (!fi.exists()) { - err("Error: tag LATEX_HEADER: header file `%s' " + config_err("Error: tag LATEX_HEADER: header file `%s' " "does not exist\n",latexHeaderFile.data()); exit(1); } } // check include path - QStrList &includePath = getList(__FILE__,__LINE__,"INCLUDE_PATH"); + QStrList &includePath = Config_getList("INCLUDE_PATH"); char *s=includePath.first(); while (s) { QFileInfo fi(s); - if (!fi.exists()) err("Warning: tag INCLUDE_PATH: include path `%s' " + if (!fi.exists()) config_err("Warning: tag INCLUDE_PATH: include path `%s' " "does not exist\n",s); -#ifndef DOXYWIZARD - addSearchDir(fi.absFilePath()); -#endif s=includePath.next(); } // check aliases - QStrList &aliasList = getList(__FILE__,__LINE__,"ALIASES"); + QStrList &aliasList = Config_getList("ALIASES"); s=aliasList.first(); while (s) { @@ -962,13 +943,13 @@ void Config::check() alias=alias.stripWhiteSpace(); if (alias.find(re)!=0) { - err("Illegal alias format `%s'. Use \"name=value\"\n",alias.data()); + config_err("Illegal alias format `%s'. Use \"name=value\"\n",alias.data()); } s=aliasList.next(); } // check dot path - QCString &dotPath = getString(__FILE__,__LINE__,"DOT_PATH"); + QCString &dotPath = Config_getString("DOT_PATH"); if (!dotPath.isEmpty()) { if (dotPath.find('\\')!=-1) @@ -992,7 +973,7 @@ void Config::check() #endif if (!dp.exists() || !dp.isFile()) { - err("Warning: the dot tool could not be found at %s\n",dotPath.data()); + config_err("Warning: the dot tool could not be found at %s\n",dotPath.data()); dotPath=""; } else @@ -1010,10 +991,10 @@ void Config::check() } // check input - QStrList &inputSources=getList(__FILE__,__LINE__,"INPUT"); + QStrList &inputSources=Config_getList("INPUT"); if (inputSources.count()==0) { - err("Error: tag INPUT: no input files specified after the INPUT tag.\n"); + config_err("Error: tag INPUT: no input files specified after the INPUT tag.\n"); exit(1); } else @@ -1024,7 +1005,7 @@ void Config::check() QFileInfo fi(s); if (!fi.exists()) { - err("Error: tag INPUT: input source `%s' does not exist\n",s); + config_err("Error: tag INPUT: input source `%s' does not exist\n",s); exit(1); } s=inputSources.next(); @@ -1032,94 +1013,94 @@ void Config::check() } // add default pattern if needed - QStrList &filePatternList = getList(__FILE__,__LINE__,"FILE_PATTERNS"); + QStrList &filePatternList = Config_getList("FILE_PATTERNS"); if (filePatternList.isEmpty()) { filePatternList.append("*"); } // add default pattern if needed - QStrList &examplePatternList = getList(__FILE__,__LINE__,"EXAMPLE_PATTERNS"); + QStrList &examplePatternList = Config_getList("EXAMPLE_PATTERNS"); if (examplePatternList.isEmpty()) { examplePatternList.append("*"); } // add default pattern if needed - //QStrList &imagePatternList = getList(__FILE__,__LINE__,"IMAGE_PATTERNS"); + //QStrList &imagePatternList = Config_getList("IMAGE_PATTERNS"); //if (imagePatternList.isEmpty()) //{ // imagePatternList.append("*"); //} // more checks needed if and only if the search engine is enabled. - if (getBool(__FILE__,__LINE__,"SEARCHENGINE")) + if (Config_getBool("SEARCHENGINE")) { // check cgi name - QCString &cgiName = getString(__FILE__,__LINE__,"CGI_NAME"); + QCString &cgiName = Config_getString("CGI_NAME"); if (cgiName.isEmpty()) { - err("Error: tag CGI_NAME: no cgi script name after the CGI_NAME tag.\n"); + config_err("Error: tag CGI_NAME: no cgi script name after the CGI_NAME tag.\n"); exit(1); } // check cgi URL - QCString &cgiURL = getString(__FILE__,__LINE__,"CGI_URL"); + QCString &cgiURL = Config_getString("CGI_URL"); if (cgiURL.isEmpty()) { - err("Error: tag CGI_URL: no URL to cgi directory specified.\n"); + config_err("Error: tag CGI_URL: no URL to cgi directory specified.\n"); exit(1); } else if (cgiURL.left(7)!="http://" && cgiURL.left(8)!="https://" ) { - err("Error: tag CGI_URL: URL to cgi directory is invalid (must " + config_err("Error: tag CGI_URL: URL to cgi directory is invalid (must " "start with http:// or https://).\n"); exit(1); } // check documentation URL - QCString &docURL = getString(__FILE__,__LINE__,"DOC_URL"); + QCString &docURL = Config_getString("DOC_URL"); if (docURL.isEmpty()) { - docURL = getString(__FILE__,__LINE__,"OUTPUT_DIRECTORY").copy().prepend("file://").append("html"); + docURL = Config_getString("OUTPUT_DIRECTORY").copy().prepend("file://").append("html"); } else if (docURL.left(7)!="http://" && docURL.left(8)!="https://" && docURL.left(7)!="file://" ) { - err("Error: tag DOC_URL: URL to documentation is invalid or " + config_err("Error: tag DOC_URL: URL to documentation is invalid or " "not absolute.\n"); exit(1); } // check absolute documentation path - QCString &docAbsPath = getString(__FILE__,__LINE__,"DOC_ABSPATH"); + QCString &docAbsPath = Config_getString("DOC_ABSPATH"); if (docAbsPath.isEmpty()) { - docAbsPath = getString(__FILE__,__LINE__,"OUTPUT_DIRECTORY")+"/html"; + docAbsPath = Config_getString("OUTPUT_DIRECTORY")+"/html"; } else if (docAbsPath[0]!='/' && docAbsPath[1]!=':') { - err("Error: tag DOC_ABSPATH: path is not absolute!\n"); + config_err("Error: tag DOC_ABSPATH: path is not absolute!\n"); exit(1); } // check path to doxysearch - QCString &binAbsPath = getString(__FILE__,__LINE__,"BIN_ABSPATH"); + QCString &binAbsPath = Config_getString("BIN_ABSPATH"); if (binAbsPath.isEmpty()) { - err("Error: tag BIN_ABSPATH: no absolute path to doxysearch " + config_err("Error: tag BIN_ABSPATH: no absolute path to doxysearch " "specified.\n"); exit(1); } else if (binAbsPath[0]!='/' && binAbsPath[1]!=':') { - err("Error: tag BIN_ABSPATH: path is not absolute!\n"); + config_err("Error: tag BIN_ABSPATH: path is not absolute!\n"); exit(1); } // check perl path bool found=FALSE; - QCString &perlPath = getString(__FILE__,__LINE__,"PERL_PATH"); + QCString &perlPath = Config_getString("PERL_PATH"); if (perlPath.isEmpty()) { QFileInfo fi; @@ -1144,7 +1125,7 @@ void Config::check() QFileInfo fi(perlPath); if (!fi.exists()) { - warn_cont("Warning: tag PERL_PATH: perl interpreter not found at default or" + config_warn("Warning: tag PERL_PATH: perl interpreter not found at default or" "user specified (%s) location\n", perlPath.data()); } @@ -1152,12 +1133,12 @@ void Config::check() } #undef PUTENV -#if defined(_WIN32) && !defined(__GNUC__) +#if defined(_WIN32) && !defined(__GNUC__) && (__BORLANDC__ < 0x0550) #define PUTENV _putenv #else #define PUTENV putenv #endif - if (getBool(__FILE__,__LINE__,"HAVE_DOT")) PUTENV("DOTFONTPATH=."); + if (Config_getBool("HAVE_DOT")) PUTENV("DOTFONTPATH=."); } @@ -1241,6 +1222,7 @@ void Config::create() ce->addValue("Slovene"); ce->addValue("Spanish"); ce->addValue("Swedish"); + ce->addValue("Ukrainian"); cb = addBool( "EXTRACT_ALL", "If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in \n" @@ -1919,17 +1901,17 @@ void Config::create() ); cb->addDependency("GENERATE_MAN"); //----------------------------------------------------------------------------------------------- - //addInfo( "XML","configuration options related to the XML output"); + addInfo( "XML","configuration options related to the XML output"); //----------------------------------------------------------------------------------------------- - //addBool( "generateXML", - // "GENERATE_XML", - // "FALSE", - // "generate XML output", - // "If the GENERATE_XML tag is set to YES Doxygen will \n" - // "generate an XML file that captures the structure of \n" - // "the code including all documentation. Warning: This feature \n" - // "is still experimental and very incomplete.\n" - // ); + cb = addBool( + "GENERATE_XML", + "If the GENERATE_XML tag is set to YES Doxygen will \n" + "generate an XML file that captures the structure of \n" + "the code including all documentation. Note that this \n" + "feature is still experimental and incomplete at the \n" + "moment. \n", + FALSE + ); //----------------------------------------------------------------------------------------------- addInfo( "Preprocessor","Configuration options related to the preprocessor "); //----------------------------------------------------------------------------------------------- @@ -2184,10 +2166,29 @@ void Config::create() } -void Config::parse(const QCString &s,const char *fn) +bool Config::parse(const char *fn) { + QFileInfo fi( fn ); + if (!fi.exists()) + { + return FALSE; + } + QFile f( fn ); + if (!f.open(IO_ReadOnly)) + { + return FALSE; + } + // read file into a string buffer + int fsize = fi.size(); + QCString contents(fsize+1); // add room for \0 terminator + if (f.readBlock(contents.data(),fsize)!=fsize) + { + return FALSE; + } + contents[fsize]='\0'; + config = Config::instance(); - inputString = s; + inputString = contents.data(); inputPosition = 0; yyLineNr = 1; yyFileName=fn; @@ -2197,6 +2198,8 @@ void Config::parse(const QCString &s,const char *fn) configYYrestart( configYYin ); BEGIN( Start ); configYYlex(); + inputString = 0; + return TRUE; } //extern "C" { // some bogus code to keep the compiler happy diff --git a/src/declinfo.l b/src/declinfo.l index 18e39d8..5548b56 100644 --- a/src/declinfo.l +++ b/src/declinfo.l @@ -27,6 +27,7 @@ #include "declinfo.h" #include "util.h" +#include "message.h" #define YY_NO_UNPUT @@ -157,6 +158,8 @@ ID ([a-z_A-Z][a-z_A-Z0-9]*)|(@[0-9]+) sharpCount=0; BEGIN(Template); } +<Template>"<<" { name+="<<"; } +<Template>">>" { name+=">>"; } <Template>"<" { name+="<"; sharpCount++; @@ -235,16 +238,29 @@ void parseFuncDecl(const QCString &decl,QCString &cl,QCString &ctl,QCString &t, name=name.left(nb); } - cl=scope.copy(); - //printf("scope=`%s'\n",scope.data()); - int il=0,ir=0; - if ((il=cl.find('<'))!=-1 && (ir=cl.findRev('>'))!=-1) // split up scope and template arguments +#if 0 { - ctl=removeRedundantWhiteSpace(cl.mid(il,ir-il+1)); - cl=cl.left(il)+cl.right(cl.length()-ir-1); + int l=scope.length(); + int i=0; + int skipCount=0; + cl.resize(0); + ctl.resize(0); + for (i=0;i<l;i++) + { + char c=scope.at(i); + if (c=='<') + skipCount++; + else if (c=='>') + skipCount--; + else if (skipCount==0) + cl+=c; + } } - //printf("cl=`%s' ctl=`%s'\n",cl.data(),ctl.data()); +#endif + cl=stripTemplateSpecifiersFromScope(removeRedundantWhiteSpace(scope),FALSE); + ctl.resize(0); n=removeRedundantWhiteSpace(name); + int il,ir; if ((il=n.find('<'))!=-1 && (ir=n.findRev('>'))!=-1) // TODO: handle cases like where n="operator<< <T>" { @@ -285,9 +301,9 @@ void dumpDecl(const char *s) QCString name; QCString args; QCString funcTNames; - printf("-----------------------------------------\n"); + msg("-----------------------------------------\n"); parseFuncDecl(s,className,classTNames,type,name,args,funcTNames); - printf("type=`%s' class=`%s' classTempl=`%s' name=`%s' " + msg("type=`%s' class=`%s' classTempl=`%s' name=`%s' " "funcTemplateNames=`%s' args=`%s'\n", type.data(),className.data(),classTNames.data(), name.data(),funcTNames.data(),args.data() diff --git a/src/definition.h b/src/definition.h index e881e43..c4ab29a 100644 --- a/src/definition.h +++ b/src/definition.h @@ -120,7 +120,7 @@ class Definition int getDefLine() const { return m_defLine; } virtual Definition *findInnerCompound(const char *name); - virtual Definition *getOuterScope() { return m_outerScope; } + virtual Definition *getOuterScope() const { return m_outerScope; } virtual void addInnerCompound(Definition *d); virtual void setOuterScope(Definition *d) { m_outerScope = d; } diff --git a/src/doxygen.cpp b/src/doxygen.cpp index c7a64eb..01a22f2 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -54,7 +54,7 @@ #include "ftvhelp.h" #include "defargs.h" #include "rtfgen.h" -//#include "xml.h" +#include "xmlgen.h" #include "reflist.h" #include "page.h" #include "packagedef.h" @@ -394,8 +394,7 @@ static void addRefItem(int todoId,int testId,int bugId,const char *prefix, static void buildGroupList(Entry *root) { - if (root->section==Entry::GROUPDOC_SEC && !root->name.isEmpty() && - (Config_getBool("EXTRACT_ALL") || root->tagInfo)) + if (root->section==Entry::GROUPDOC_SEC && !root->name.isEmpty()) { //printf("Found group %s title=`%s'\n",root->name.data(),root->type.data()); @@ -675,7 +674,7 @@ static Definition *findScope(Entry *root,int level=0) static Definition *findScopeFromQualifiedName(Definition *startScope,const QCString &n) { - //printf("findScopeFromName(%s,%s)\n",startScope ? startScope->name().data() : 0, n.data()); + //printf("findScopeFromQualifiedName(%s,%s)\n",startScope ? startScope->name().data() : 0, n.data()); QCString name(n); if (startScope==0) startScope=Doxygen::globalScope; int i = name.find("::"); @@ -684,25 +683,58 @@ static Definition *findScopeFromQualifiedName(Definition *startScope,const QCStr return startScope; } - QCString scope; - while ((i = name.find("::"))!=-1) + QCString scope=stripTemplateSpecifiersFromScope(name,FALSE); + //printf("name=%s -> scope=%s\n",name.data(),scope.data()); + while ((i = scope.find("::"))!=-1) { - int ti = name.find('<'); - if (ti!=-1 && ti<i) i=ti; // strip template specifiers - QCString nestedNameSpecifier = name.left(i); + //int ti = name.find('<'); + //if (ti!=-1 && ti<i) i=ti; // strip template specifiers + QCString nestedNameSpecifier = scope.left(i); //Definition *oldScope = startScope; startScope = startScope->findInnerCompound(nestedNameSpecifier); + //printf("Trying %s result=%p\n",nestedNameSpecifier.data(),startScope); if (startScope==0) { //printf("name %s not found in scope %s\n",nestedNameSpecifier.data(),oldScope->name().data()); return 0; } - name = name.right(name.length()-i-2); + scope = scope.right(scope.length()-i-2); + //printf("scope=%s\n",scope.data()); } - //printf("findScopeFromName() result=%s\n",startScope ? startScope->name().data() : 0); + //printf("findScopeFromQualifiedName() result=%s\n",startScope ? startScope->name().data() : 0); return startScope; } +ArgumentList *getTemplateArgumentsFromName( + const QCString &name, + const QList<ArgumentList> *tArgLists) +{ + if (tArgLists==0) return 0; + + QListIterator<ArgumentList> ali(*tArgLists); + // for each scope fragment, check if it is a template and advance through + // the list if so. + int i,p=0; + while ((i=name.find("::",p))!=-1) + { + NamespaceDef *nd = Doxygen::namespaceDict[name.left(i)]; + if (nd==0) + { + ClassDef *cd = getClass(name.left(i)); + if (cd) + { + if (cd->templateArguments()) + { + ++ali; + } + } + } + p=i+2; + } + return ali.current(); +} + + //---------------------------------------------------------------------- // build a list of all classes mentioned in the documentation // and all classes that have a documentation block before their definition. @@ -725,7 +757,11 @@ static void buildClassList(Entry *root) } else { + Debug::print(Debug::Classes,0," Found class with raw name %s\n",fullName.data()); + fullName=stripAnonymousNamespaceScope(fullName); + fullName=stripTemplateSpecifiersFromScope(fullName); + Debug::print(Debug::Classes,0," Found class with name %s\n",fullName.data()); bool ambig; @@ -736,11 +772,11 @@ static void buildClassList(Entry *root) if ((cd=getClass(fullName))) { Debug::print(Debug::Classes,0," Existing class!\n",fullName.data()); - if (cd->templateArguments()==0) - { - //printf("existing ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data()); - cd->setTemplateArguments(root->tArgList); - } + //if (cd->templateArguments()==0) + //{ + // //printf("existing ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data()); + // cd->setTemplateArguments(tArgList); + //} if (!root->doc.isEmpty() || !root->brief.isEmpty() || (root->bodyLine!=-1 && Config_getBool("SOURCE_BROWSER")) ) @@ -818,7 +854,8 @@ static void buildClassList(Entry *root) case Entry::EXCEPTIONDOC_SEC: sec=ClassDef::Exception; break; } - Debug::print(Debug::Classes,0," New class `%s' (sec=0x%08x)!\n",fullName.data(),root->section); + Debug::print(Debug::Classes,0," New class `%s' (sec=0x%08x)! #tArgLists=%d\n", + fullName.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1); QCString className; QCString namespaceName; extractNamespaceName(fullName,className,namespaceName); @@ -837,7 +874,13 @@ static void buildClassList(Entry *root) cd->setDocumentation(root->doc); // copy docs to definition cd->setBriefDescription(root->brief); //printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data()); - cd->setTemplateArguments(root->tArgList); + + + 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->addSectionsToDefinition(root->anchors); @@ -1663,6 +1706,7 @@ void buildVarList(Entry *root) mtype=MemberDef::Variable; QCString classScope=stripAnonymousNamespaceScope(scope); + classScope=stripTemplateSpecifiersFromScope(classScope,FALSE); QCString annScopePrefix=scope.left(scope.length()-classScope.length()); scope=classScope; if (!scope.isEmpty() && !name.isEmpty() && (cd=getClass(scope))) @@ -1739,7 +1783,7 @@ static void buildMemberList(Entry *root) { Debug::print(Debug::Functions,0, "FUNCTION_SEC:\n" - " `%s' `%s'::`%s' `%s' relates=`%s' file=`%s' line=`%d' bodyLine=`%d' #targs=%d #mtargs=%d mGrpId=%d memSpec=%d\n", + " `%s' `%s'::`%s' `%s' relates=`%s' file=`%s' line=`%d' bodyLine=`%d' #tArgLists=%d mGrpId=%d memSpec=%d\n", root->type.data(), root->parent->name.data(), root->name.data(), @@ -1748,8 +1792,9 @@ static void buildMemberList(Entry *root) root->fileName.data(), root->startLine, root->bodyLine, - root->tArgList ? (int)root->tArgList->count() : -1, - root->mtArgList ? (int)root->mtArgList->count() : -1, + root->tArgLists ? (int)root->tArgLists->count() : -1, + //root->tArgList ? (int)root->tArgList->count() : -1, + //root->mtArgList ? (int)root->mtArgList->count() : -1, root->mGrpId, root->memSpec ); @@ -1767,6 +1812,7 @@ static void buildMemberList(Entry *root) // root->parent->name.data(),getClass(root->parent->name), // root->type.find(re,0)); QCString scope=stripAnonymousNamespaceScope(root->parent->name.copy()); + scope=stripTemplateSpecifiersFromScope(scope,FALSE); bool isMember=FALSE; int memIndex=rname.find("::"); @@ -1828,11 +1874,12 @@ static void buildMemberList(Entry *root) //printf("new member: %s member template args=`%s'\n", // root->args.data(), // argListToString(root->mtArgList).data()); + MemberDef *md=new MemberDef( root->fileName,root->startLine, root->type,name,root->args,root->exception, root->protection,root->virt,root->stat,!root->relates.isEmpty(), - mtype,root->mtArgList,root->argList); + mtype,root->tArgLists ? root->tArgLists->last() : 0,root->argList); if (root->tagInfo) { md->setAnchor(root->tagInfo->anchor); @@ -1876,26 +1923,27 @@ static void buildMemberList(Entry *root) } else { + QCString qualScope = cd->qualifiedNameWithTemplateParameters(); if (!root->type.isEmpty()) { if (root->argList) { - def=root->type+" "+scope+"::"+name; + def=root->type+" "+qualScope+"::"+name; } else { - def=root->type+" "+scope+"::"+name+root->args; + def=root->type+" "+qualScope+"::"+name+root->args; } } else { if (root->argList) { - def=scope+"::"+name; + def=qualScope+"::"+name; } else { - def=scope+"::"+name+root->args; + def=qualScope+"::"+name+root->args; } } } @@ -1907,7 +1955,7 @@ static void buildMemberList(Entry *root) " `%s' `%s'::`%s' `%s' proto=%d\n" " def=`%s'\n", root->type.data(), - root->parent->name.data(), + scope.data(), rname.data(), root->args.data(), root->proto, @@ -2023,12 +2071,13 @@ static void buildMemberList(Entry *root) // root->type.data(),rname.data(),root->args.data(),root->bodyLine); // new global function + ArgumentList *tArgList = root->tArgLists ? root->tArgLists->last() : 0; QCString name=removeRedundantWhiteSpace(rname); MemberDef *md=new MemberDef( root->fileName,root->startLine, root->type,name,root->args,root->exception, root->protection,root->virt,root->stat,FALSE, - MemberDef::Function,root->tArgList,root->argList); + MemberDef::Function,tArgList,root->argList); if (root->tagInfo) { md->setAnchor(root->tagInfo->anchor); @@ -2686,7 +2735,8 @@ static bool findClassRelation( //printf("scopePrefix=`%s' bi->name=`%s'\n", // scopeName.left(scopeOffset).data(),bi->name.data()); - QCString baseClassName=removeRedundantWhiteSpace(bi->name); + QCString baseClassName=stripTemplateSpecifiersFromScope + (removeRedundantWhiteSpace(bi->name)); if (scopeOffset>0) { baseClassName.prepend(scopeName.left(scopeOffset)+"::"); @@ -3002,6 +3052,7 @@ static void findInheritedTemplateInstances() ClassDef *cd; // strip any annonymous scopes first QCString bName=stripAnonymousNamespaceScope(root->name); + bName=stripTemplateSpecifiersFromScope(bName); Debug::print(Debug::Classes,0," Class %s : \n",bName.data()); if ((cd=getClass(bName))) { @@ -3022,6 +3073,7 @@ static void findUsedTemplateInstances() ClassDef *cd; // strip any annonymous scopes first QCString bName=stripAnonymousNamespaceScope(root->name); + bName=stripTemplateSpecifiersFromScope(bName); Debug::print(Debug::Classes,0," Class %s : \n",bName.data()); if ((cd=getClass(bName))) { @@ -3041,6 +3093,7 @@ static void computeClassRelations() ClassDef *cd; // strip any annonymous scopes first QCString bName=stripAnonymousNamespaceScope(root->name); + bName=stripTemplateSpecifiersFromScope(bName); Debug::print(Debug::Classes,0," Class %s : \n",bName.data()); if ((cd=getClass(bName))) { @@ -3065,6 +3118,7 @@ static void computeTemplateClassRelations() for (;(root=edi.current());++edi) { QCString bName=stripAnonymousNamespaceScope(root->name); + bName=stripTemplateSpecifiersFromScope(bName); ClassDef *cd=getClass(bName); // strip any annonymous scopes first QDict<ClassDef> *templInstances = 0; @@ -3607,92 +3661,74 @@ static bool findGlobalMember(Entry *root, return TRUE; } -static void substituteTemplateArgNames(ArgumentList *src, - const QCString &s, - ArgumentList *tempArgs, +static void substituteTemplatesInArgList( + const QList<ArgumentList> &srcTempArgLists, + const QList<ArgumentList> &dstTempArgLists, + ArgumentList *src, ArgumentList *dst) { - ArgumentListIterator ali(*src); - Argument *a=0; - for (ali.toFirst();(a=ali.current());++ali) // for each member argument + ArgumentListIterator sali(*src); + Argument *sa=0; + Argument *da=dst->first(); + + for (sali.toFirst();(sa=sali.current());++sali) // for each member argument { - QCString type=a->type.copy(); - bool isReplaced=FALSE; + QCString srcType = sa->type; QRegExp re(idMask); - int i,p=0,l,c=0; - while (!s.isEmpty() && (i=re.match(s,p,&l))!=-1) // for each template name found at the - // member definition + //printf("type=%s\n",sa->type.data()); + + int i,p=0,l; + QCString dstType; + while ((i=re.match(srcType,p,&l))!=-1) // for each word in srcType { - Argument *ta = c<(int)tempArgs->count() ? tempArgs->at(c) : 0; - if (ta) // get matching template argument of the class + bool found=FALSE; + dstType+=srcType.mid(p,i-p); + QCString name=srcType.mid(i,l); + + QListIterator<ArgumentList> srclali(srcTempArgLists); + QListIterator<ArgumentList> dstlali(dstTempArgLists); + for (;srclali.current() && !found;++srclali,++dstlali) { - QCString dstName=s.mid(i,l); - QCString srcName=ta->name.copy(); - if (srcName.isEmpty()) srcName=ta->type.copy(); - //printf("1.Template Name = `%s' -> `%s'\n",srcName.data(),dstName.data()); - int bi; - if ((bi=srcName.findRev(' '))!=-1) // search for separator - { - // strip the type specifier (usually class or typename) - srcName=srcName.right(srcName.length()-bi-1); - } + ArgumentListIterator tsali(*srclali.current()); + ArgumentListIterator tdali(*dstlali.current()); + Argument *tsa =0,*tda=0; - //if (srcName.left(6)=="class ") srcName=srcName.right(srcName.length()-6); - //if (srcName.left(9)=="typename ") srcName=srcName.right(srcName.length()-9); - //printf("2.Template Name = `%s' -> `%s'\n",srcName.data(),dstName.data()); - if (srcName!=dstName) /* we need to substitute */ + for (tsali.toFirst();(tsa=tsali.current()) && !found;++tsali) { - int ti,tp=0; - QCString result; - int sl=srcName.length(); - while ((ti=type.find(srcName,tp))!=-1) + tda = tdali.current(); + if (tda && name==tsa->name) { - result+=type.mid(tp,ti-tp); - if ( - (ti==0 || !isId(type.at(ti-1))) && - (ti+sl==(int)type.length() || !isId(type.at(ti+sl))) - ) /* idenitifier -> replace */ - { - result+=dstName; - } - else /* substring of an identifier */ - { - result+=srcName; - } - tp=ti+sl; + name=tda->name; // substitute + found=TRUE; } - result+=type.right(type.length()-tp); - type=result; - isReplaced = TRUE; + if (tda) ++tdali; } } + dstType+=name; p=i+l; - c++; } - Argument *na = new Argument(*a); - if (isReplaced) + dstType+=srcType.right(srcType.length()-p); + if (da==0) { - //printf("Template Arg: `%s' -> `%s'\n",na->type.data(),type.data()); - na->type=type; + da=new Argument(*sa); + dst->append(da); + da->type=dstType; + da=0; } else { - //printf("Template Arg `%s' not changed\n",a->type.data()); + da->type=dstType; + da=dst->next(); } - dst->append(na); } - //printf("substituteTemplateArgNames(\nsrc=`%s',\ntempNameStr=`%s',\ntempArgs=`%s',\ndest=`%s'\n)\n", - // argListToString(src).data(), - // s.data(), - // argListToString(tempArgs).data(), - // argListToString(dst).data() - // ); dst->constSpecifier = src->constSpecifier; dst->volatileSpecifier = src->volatileSpecifier; dst->pureSpecifier = src->pureSpecifier; - + //printf("substituteTemplatesInArgList: replacing %s with %s\n", + // argListToString(src).data(),argListToString(dst).data()); } + static QCString mergeScopes(const QCString &leftScope,const QCString &rightScope) { // case leftScope=="A" rightScope=="A::B" => result = "A::B" @@ -3744,11 +3780,10 @@ static void findMember(Entry *root, { Debug::print(Debug::FindMembers,0, "findMember(root=%p,funcDecl=`%s',related=`%s',overload=%d," - "isFunc=%d mGrpId=%d tArgList=%p=\"%s\" mtArgList=%p=\"%s\" " + "isFunc=%d mGrpId=%d tArgList=%p (#=%d) " "scopeSpec=%s memberSpec=%s memSpec=%d\n", root,funcDecl.data(),related.data(),overloaded,isFunc,root->mGrpId, - root->tArgList,tempArgListToString(root->tArgList).data(), - root->mtArgList,tempArgListToString(root->mtArgList).data(), + root->tArgLists,root->tArgLists ? root->tArgLists->count() : 0, root->scopeSpec.data(),root->memberSpec.data(),root->memSpec ); //if (Config::instance()->get("") && !root->body.isEmpty()) @@ -3829,18 +3864,6 @@ static void findMember(Entry *root, //printf("scopeName=`%s' funcType=`%s' funcName=`%s'\n", // scopeName.data(),funcType.data(),funcName.data()); - //bool isSpecialization = !root->scopeSpec.isEmpty() && - // root->scopeSpec != tempArgListToString(root->tArgList); - - // if this is a member template inside non template class, the parser puts - // template specifier in scopeSepc, so we copy it to the right location here - if (scopeName.isEmpty() && !root->scopeSpec.isEmpty() && - root->memberSpec.isEmpty() && funcTempList.isEmpty() - ) // template specifier that was found is for a function - { - funcTempList = root->scopeSpec; - } - // the class name can also be a namespace name, we decide this later. // if a related class name is specified and the class name could // not be derived from the function declaration, then use the @@ -3862,6 +3885,7 @@ static void findMember(Entry *root, !root->parent->name.isEmpty()) { scopeName = mergeScopes(root->parent->name,scopeName); + scopeName = stripTemplateSpecifiersFromScope(scopeName); } // split scope into a namespace and a class part @@ -3869,61 +3893,6 @@ static void findMember(Entry *root, //printf("scopeName=`%s' className=`%s' namespaceName=`%s'\n", // scopeName.data(),className.data(),namespaceName.data()); -#if 0 - if (related.isEmpty() && - root->parent && - !root->parent->name.isEmpty() - ) // prefix scope in which the member was found - { - Entry *p=root->parent; - while (p) // get full scope as class name - { - QCString sc = stripAnonymousNamespaceScope(p->name); - if ((p->section & Entry::SCOPE_MASK) - && !sc.isEmpty() && sc[0]!='@' - ) - { - QCString cn; - QCString nn; - extractNamespaceName(sc,cn,nn); - if (leftScopeMatch(nn,namespaceName) || namespaceName.isEmpty()) - { - namespaceName=nn.copy(); - } - if (leftScopeMatch(cn,className) || className.isEmpty()) - { - className=cn.copy(); - } - - //printf("sc=`%s' cn=`%s' nn=`%s'\n",sc.data(),cn.data(),nn.data()); - - //printf("p->name=`%s' scopeName=`%s' classTempList=%s\n", - // p->name.data(),scopeName.data(),classTempList.data()); - - QCString tryClass; - - if (className.find('<')==-1 && !classTempList.isEmpty()) - tryClass=insertTemplateSpecifierInScope(className,classTempList); - else - tryClass=className.copy(); - - //printf("tryClass=%s\n",tryClass.data()); - - if (leftScopeMatch(tryClass,cn)) - break; // scope already present, so stop now - - // prepend name to scope - if (!scopeName.isEmpty()) scopeName.prepend("::"); - scopeName.prepend(sc); - break; - } - p=p->parent; - } - //printf("3. scopeName=`%s'\n",scopeName.data()); - //printf("result: scope=%s\n",scopeName.data()); - } -#endif - namespaceName=removeAnonymousScopes(namespaceName); //printf("namespaceName=`%s' className=`%s'\n",namespaceName.data(),className.data()); // merge class and namespace scopes again @@ -3945,54 +3914,15 @@ static void findMember(Entry *root, } //printf("new scope=`%s'\n",scopeName.data()); - if (!scopeName.isEmpty() && - scopeName.find('<')==-1 && - classTempList.isEmpty() - ) - { - ClassDef *cd=getClass(scopeName); - // class is a template, but no template name list found - if (root->tArgList && cd && cd->templateArguments()) - { - classTempList = tempArgListToString(root->tArgList); - } - } - - QCString tempScopeName=scopeName.copy(); - int ti=tempScopeName.find('<'); - if (ti==-1) + ClassDef *cd=getClass(scopeName); + if (cd) { - int spi = namespaceName.isEmpty() ? 0 : namespaceName.length()+2; - if ((ti=tempScopeName.find("::",spi))!=-1 && !classTempList.isEmpty()) - { - // insert template parameters after the first scope name - tempScopeName=tempScopeName.left(ti)+classTempList+ - tempScopeName.right(tempScopeName.length()-ti); - } - else - { - tempScopeName+=classTempList; - } - } - - if (root->tArgList==0 && root->mtArgList==0 && !classTempList.isEmpty()) - { - // no template specifiers found during parsing (because \fn was used), - // but there are template names in the scope, so we build the template - // specifiers from that. - //printf("Building template list from `%s'\n",classTempList.data()); - root->tArgList = new ArgumentList; - QRegExp re(idMask); - int i,p=0,l; - while ((i=re.match(classTempList,p,&l))!=-1) // for each template name found - { - Argument *a = new Argument; - a->type = "class "+classTempList.mid(i,l); - root->tArgList->append(a); - p=i+l; - } + if (root->tArgLists) root->tArgLists->first(); + tempScopeName=cd->qualifiedNameWithTemplateParameters(root->tArgLists); } + //printf("scopeName=%s cd=%p root->tArgLists=%p result=%s\n", + // scopeName.data(),cd,root->tArgLists,tempScopeName.data()); //printf("scopeName=`%s' className=`%s'\n",scopeName.data(),className.data()); // rebuild the function declaration (needed to get the scope right). @@ -4100,58 +4030,69 @@ static void findMember(Entry *root, { ClassDef *cd=md->getClassDef(); Debug::print(Debug::FindMembers,0, - "3. member definition found scope needed=`%s' scope=`%s' args=`%s'\n", + "3. member definition found, " + "scope needed=`%s' scope=`%s' args=`%s'\n", scopeName.data(),cd ? cd->name().data() : "<none>", md->argsString()); //printf("Member %s (member scopeName=%s) (this scopeName=%s) classTempList=%s\n",md->name().data(),cd->name().data(),scopeName.data(),classTempList.data()); - ClassDef *tcd=0; - bool ambig; FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig); NamespaceDef *nd=0; if (!namespaceName.isEmpty()) nd=getResolvedNamespace(namespaceName); - tcd = findClassDefinition(fd,nd,scopeName,classTempList); + + ClassDef *tcd=findClassDefinition(fd,nd,scopeName,classTempList); if (cd && tcd==cd) // member's classes match { Debug::print(Debug::FindMembers,0, "4. class definition %s found\n",cd->name().data()); - int ci; - ArgumentList *classTemplArgs = cd->templateArguments(); - ArgumentList *funcTemplArgs = md->memberDefTemplateArguments(); - if ((ci=cd->name().find("::"))!=-1) // nested class + //int ci; + //ArgumentList *classTemplArgs = cd->templateArguments(); + //ArgumentList *funcTemplArgs = md->memberDefTemplateArguments(); + //if ((ci=cd->name().find("::"))!=-1) // nested class + //{ + // ClassDef *parentClass = getClass(cd->name().left(ci)); + // if (parentClass) + // classTemplArgs = parentClass->templateArguments(); + //} + ////printf("cd->name=%s classTemplArgs=%s\n",cd->name().data(), + //// argListToString(classTemplArgs).data()); + + + // get the template parameter lists found at the member declaration + QList<ArgumentList> declTemplArgs; + cd->getTemplateParameterLists(declTemplArgs); + if (md->templateArguments()) { - ClassDef *parentClass = getClass(cd->name().left(ci)); - if (parentClass) - classTemplArgs = parentClass->templateArguments(); + declTemplArgs.append(md->templateArguments()); } - //printf("cd->name=%s classTemplArgs=%s\n",cd->name().data(), - // argListToString(classTemplArgs).data()); - ArgumentList *argList = 0; + // get the template parameter lists found at the member definition + QList<ArgumentList> *defTemplArgs = root->tArgLists; + //printf("defTemplArgs=%p\n",defTemplArgs); + + // do we replace the decl argument lists with the def argument lists? bool substDone=FALSE; + ArgumentList *argList=0; /* substitute the occurrences of class template names in the * argument list before matching */ - if (!classTempList.isEmpty() && - classTemplArgs && + if (declTemplArgs.count()>0 && defTemplArgs && + declTemplArgs.count()==defTemplArgs->count() && md->argumentList() ) { /* the function definition has template arguments - * and the class also has template arguments, so - * we must substitute the template names if they are - * different before doing the match + * and the class definition also has template arguments, so + * we must substitute the template names of the class by that + * of the function definition before matching. */ argList = new ArgumentList; argList->setAutoDelete(TRUE); - substituteTemplateArgNames( - md->argumentList(), /* source argument list */ - classTempList, /* template names source */ - classTemplArgs, /* template names dest */ - argList /* dest argument list */ - ); + substituteTemplatesInArgList(declTemplArgs,*defTemplArgs, + md->argumentList(),argList); + substDone=TRUE; } else /* no template arguments, compare argument lists directly */ @@ -4159,29 +4100,6 @@ static void findMember(Entry *root, argList = md->argumentList(); } - /* substitute the occurrences of member template names in the - * argument list before matching - */ - if (!funcTempList.isEmpty() && - funcTemplArgs && - md->argumentList() - ) - { - ArgumentList *oldArgList = argList; - argList = new ArgumentList; - substituteTemplateArgNames( - oldArgList, /* source argument list */ - funcTempList, /* template names source */ - funcTemplArgs, /* template names dest */ - argList /* dest argument list */ - ); - if (substDone) // delete old argument list - { - delete oldArgList; - } - substDone=TRUE; - } - Debug::print(Debug::FindMembers,0, "5. matching `%s'<=>`%s' className=%s namespaceName=%s\n", argListToString(argList).data(),argListToString(root->argList).data(), @@ -4221,8 +4139,9 @@ static void findMember(Entry *root, //printf("Setting member template argument of member %s to %s\n", // md->name().data(), argListToString(root->mtArgList).data() // ); - md->setScopeDefTemplateArguments(root->tArgList); - md->setMemberDefTemplateArguments(root->mtArgList); + + md->setDefinitionTemplateParameterLists(root->tArgLists); + //md->setMemberDefTemplateArguments(root->mtArgList); md->setArgumentList(argList); } else // no match -> delete argument list @@ -4296,11 +4215,13 @@ static void findMember(Entry *root, else mtype=MemberDef::Function; // new overloaded member function + ArgumentList *tArgList = + getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists); MemberDef *md=new MemberDef( root->fileName,root->startLine, funcType,funcName,funcArgs,exceptions, root->protection,root->virt,root->stat,TRUE, - mtype,root->tArgList,root->argList); + mtype,tArgList,root->argList); if (root->tagInfo) { md->setAnchor(root->tagInfo->anchor); @@ -4362,7 +4283,7 @@ static void findMember(Entry *root, if (!newMember && rmd) // member already exists as rmd -> add docs { //printf("addMemberDocs for related member %s\n",root->name.data()); - rmd->setMemberDefTemplateArguments(root->mtArgList); + //rmd->setMemberDefTemplateArguments(root->mtArgList); addMemberDocs(root,rmd,funcDecl,0,overloaded); } } @@ -4380,11 +4301,13 @@ static void findMember(Entry *root, mtype=MemberDef::Function; // new related (member) function + ArgumentList *tArgList = + getTemplateArgumentsFromName(scopeName+"::"+funcName,root->tArgLists); MemberDef *md=new MemberDef( root->fileName,root->startLine, funcType,funcName,funcArgs,exceptions, root->protection,root->virt,root->stat,TRUE, - mtype,root->tArgList,root->argList); + mtype,tArgList,root->argList); if (root->tagInfo) { md->setAnchor(root->tagInfo->anchor); @@ -4443,7 +4366,7 @@ static void findMember(Entry *root, md->setBriefDescription(root->brief); md->addSectionsToDefinition(root->anchors); md->setMemberGroupId(root->mGrpId); - md->setMemberDefTemplateArguments(root->mtArgList); + //md->setMemberDefTemplateArguments(root->mtArgList); mn->append(md); cd->insertMember(md); cd->insertUsedFile(root->fileName); @@ -5229,8 +5152,12 @@ static void generateClassDocs() for ( ; cli.current() ; ++cli ) { ClassDef *cd=cli.current(); - if ( cd->isLinkableInProject() && cd->templateMaster()==0 ) - // skip external references, anonymous compounds and template instances + if ( cd->isLinkableInProject() && cd->templateMaster()==0 && + (cd->getOuterScope()==0 || + cd->getOuterScope()->definitionType()!=Definition::TypeClass + ) + ) // skip external references, anonymous compounds and + // template instances and nested classes { msg("Generating docs for compound %s...\n",cd->name().data()); @@ -6573,9 +6500,11 @@ void readConfiguration(int argc, char **argv) { if (optind+4<argc) { - QCString configFile=fileToString(argv[optind+4]); - if (configFile.isEmpty()) exit(1); - Config::instance()->parse(fileToString(argv[optind+4]),argv[optind+4]); + if (!Config::instance()->parse(argv[optind+4])) + { + err("Error opening or reading configuration file %s!\n",argv[optind+4]); + exit(1); + } Config::instance()->substituteEnvironmentVars(); Config::instance()->convertStrToVal(); Config::instance()->check(); @@ -6611,9 +6540,11 @@ void readConfiguration(int argc, char **argv) { if (optind+3<argc) // use config file to get settings { - QCString configFile=fileToString(argv[optind+3]); - if (configFile.isEmpty()) exit(1); - Config::instance()->parse(fileToString(argv[optind+3]),argv[optind+3]); + if (!Config::instance()->parse(argv[optind+3])) + { + err("Error opening or reading configuration file %s!\n",argv[optind+3]); + exit(1); + } Config::instance()->substituteEnvironmentVars(); Config::instance()->convertStrToVal(); Config::instance()->check(); @@ -6679,17 +6610,14 @@ void readConfiguration(int argc, char **argv) } QFileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile"); - QCString config; if (optind>=argc) { if (configFileInfo1.exists()) { - config=fileToString("Doxyfile"); configName="Doxyfile"; } else if (configFileInfo2.exists()) { - config=fileToString("doxyfile"); configName="doxyfile"; } else @@ -6703,7 +6631,6 @@ void readConfiguration(int argc, char **argv) QFileInfo fi(argv[optind]); if (fi.exists() || strcmp(argv[optind],"-")==0) { - config=fileToString(argv[optind]); configName=argv[optind]; } else @@ -6713,7 +6640,11 @@ void readConfiguration(int argc, char **argv) } } - Config::instance()->parse(config,configName); + if (!Config::instance()->parse(configName)) + { + err("Error: could not open or read configuration file %s!\n",configName); + exit(1); + } if (updateConfig) { @@ -6724,6 +6655,22 @@ void readConfiguration(int argc, char **argv) Config::instance()->substituteEnvironmentVars(); Config::instance()->convertStrToVal(); Config::instance()->check(); + initWarningFormat(); + QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE"); + if (!outputLanguage.isEmpty() && !setTranslator(outputLanguage)) + { + err("Error: Output language %s not supported! Using English instead.\n", + outputLanguage.data()); + } + QStrList &includePath = Config_getList("INCLUDE_PATH"); + char *s=includePath.first(); + while (s) + { + QFileInfo fi(s); + addSearchDir(fi.absFilePath()); + s=includePath.next(); + } + } void parseInput() @@ -7075,7 +7022,7 @@ void parseInput() msg("Searching for documented defines...\n"); findDefineDocumentation(root); - msg("Computing template instances..."); + msg("Computing template instances...\n"); findClassEntries(root); findInheritedTemplateInstances(); findUsedTemplateInstances(); @@ -7089,7 +7036,7 @@ void parseInput() // computeClassImplUsageRelations(); //} - msg("Computing class relations..."); + msg("Computing class relations...\n"); computeTemplateClassRelations(); computeClassRelations(); classEntries.clear(); @@ -7342,5 +7289,10 @@ void generateOutput() if (Config_getBool("GENERATE_HTML") && Config_getBool("DOT_CLEANUP")) removeDoxFont(Config_getString("HTML_OUTPUT")); if (Config_getBool("GENERATE_RTF") && Config_getBool("DOT_CLEANUP")) removeDoxFont(Config_getString("RTF_OUTPUT")); + if (Config_getBool("GENERATE_XML")) + { + msg("Generating XML output...\n"); + generateXML(); + } } diff --git a/src/doxygen.pro.in b/src/doxygen.pro.in index 3183de8..30e8ace 100644 --- a/src/doxygen.pro.in +++ b/src/doxygen.pro.in @@ -24,7 +24,7 @@ win32-mingw:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools win32-msvc:LIBS += qtools.lib doxygen.lib doxycfg.lib shell32.lib win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\lib win32-borland:LIBS += qtools.lib doxygen.lib doxycfg.lib shell32.lib -win32-borland:TMAKE_LFLAGS += -L..\lib +win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk win32:TMAKE_CXXFLAGS += -DQT_NODLL INCLUDEPATH += ../qtools . DESTDIR = ../bin diff --git a/src/doxytag.pro.in b/src/doxytag.pro.in index 0eab64b..090ec81 100644 --- a/src/doxytag.pro.in +++ b/src/doxytag.pro.in @@ -25,7 +25,7 @@ win32-mingw:LIBS += -L../lib -lqtools win32-msvc:LIBS += qtools.lib shell32.lib win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\lib win32-borland:LIBS += qtools.lib shell32.lib -win32-borland:TMAKE_LFLAGS += -L..\lib +win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk win32:TMAKE_CXXFLAGS += -DQT_NODLL INCLUDEPATH += ../qtools OBJECTS_DIR = ../objects diff --git a/src/entry.cpp b/src/entry.cpp index bbea6ef..44081c2 100644 --- a/src/entry.cpp +++ b/src/entry.cpp @@ -16,6 +16,7 @@ */ #include "entry.h" +#include "util.h" int Entry::num=0; @@ -36,8 +37,8 @@ Entry::Entry() argList = new ArgumentList; argList->setAutoDelete(TRUE); //printf("Entry::Entry() tArgList=0\n"); - tArgList = 0; - mtArgList = 0; + tArgLists = 0; + //mtArgList = 0; mGrpId = -1; tagInfo = 0; groupdoctype = GROUPDOC_NORMAL; @@ -90,8 +91,8 @@ Entry::Entry(const Entry &e) argList = new ArgumentList; argList->setAutoDelete(TRUE); //printf("Entry::Entry(copy) tArgList=0\n"); - tArgList = 0; - mtArgList = 0; + tArgLists = 0; + //mtArgList = 0; groupdoctype = e.groupdoctype; // deep copy of the child entry list @@ -136,33 +137,25 @@ Entry::Entry(const Entry &e) argList->volatileSpecifier = e.argList->volatileSpecifier; argList->pureSpecifier = e.argList->pureSpecifier; - // deep copy template argument list - if (e.tArgList) + // deep copy template argument lists + if (e.tArgLists) { - tArgList = new ArgumentList; - tArgList->setAutoDelete(TRUE); - //printf("Entry::Entry(copy) new tArgList=%p\n",tArgList); - QListIterator<Argument> tali(*e.tArgList); - for (;(a=tali.current());++tali) - { - tArgList->append(new Argument(*a)); - //printf("appending argument %s %s\n",a->type.data(),a->name.data()); - } + tArgLists = copyArgumentLists(e.tArgLists); } // deep copy template argument list - if (e.mtArgList) - { - mtArgList = new ArgumentList; - mtArgList->setAutoDelete(TRUE); - //printf("Entry::Entry(copy) new tArgList=%p\n",tArgList); - QListIterator<Argument> mtali(*e.mtArgList); - for (;(a=mtali.current());++mtali) - { - mtArgList->append(new Argument(*a)); - //printf("appending argument %s %s\n",a->type.data(),a->name.data()); - } - } + //if (e.mtArgList) + //{ + // mtArgList = new ArgumentList; + // mtArgList->setAutoDelete(TRUE); + // //printf("Entry::Entry(copy) new tArgList=%p\n",tArgList); + // QListIterator<Argument> mtali(*e.mtArgList); + // for (;(a=mtali.current());++mtali) + // { + // mtArgList->append(new Argument(*a)); + // //printf("appending argument %s %s\n",a->type.data(),a->name.data()); + // } + //} } @@ -175,8 +168,8 @@ Entry::~Entry() delete groups; delete anchors; delete argList; - delete tArgList; - delete mtArgList; + delete tArgLists; + //delete mtArgList; delete tagInfo; num--; } @@ -244,8 +237,8 @@ void Entry::reset() anchors->clear(); argList->clear(); if (tagInfo) { delete tagInfo; tagInfo=0; } - if (tArgList) { delete tArgList; tArgList=0; } - if (mtArgList) { delete mtArgList; mtArgList=0; } + if (tArgLists) { delete tArgLists; tArgLists=0; } + //if (mtArgList) { delete mtArgList; mtArgList=0; } } @@ -296,7 +289,7 @@ int Entry::getSize() e=sublist->next(); } Argument *a=argList->first(); - while (e) + while (a) { size+=sizeof(Argument); size+=a->type.length()+1 @@ -304,30 +297,36 @@ int Entry::getSize() +a->defval.length()+1; a=argList->next(); } - if (tArgList) - { - a=tArgList->first(); - while (e) - { - size+=sizeof(Argument); - size+=a->type.length()+1 - +a->name.length()+1 - +a->defval.length()+1; - a=tArgList->next(); - } - } - if (mtArgList) + if (tArgLists) { - a=mtArgList->first(); - while (e) + ArgumentList *al=tArgLists->first(); + while (al) { - size+=sizeof(Argument); - size+=a->type.length()+1 - +a->name.length()+1 - +a->defval.length()+1; - a=mtArgList->next(); + size+=sizeof(ArgumentList); + a=al->first(); + while (a) + { + size+=sizeof(Argument); + size+=a->type.length()+1 + +a->name.length()+1 + +a->defval.length()+1; + a=al->next(); + } + al=tArgLists->next(); } } + //if (mtArgList) + //{ + // a=mtArgList->first(); + // while (e) + // { + // size+=sizeof(Argument); + // size+=a->type.length()+1 + // +a->name.length()+1 + // +a->defval.length()+1; + // a=mtArgList->next(); + // } + //} return size; } diff --git a/src/entry.h b/src/entry.h index 7717eb9..476fea5 100644 --- a/src/entry.h +++ b/src/entry.h @@ -252,8 +252,9 @@ class Entry QCString args; //!< member argument string QCString bitfields; //!< member's bit fields ArgumentList *argList; //!< member arguments as a list - ArgumentList *tArgList; //!< template argument list - ArgumentList *mtArgList; //!< member template argument list + QList<ArgumentList> *tArgLists; //!< template argument declarations + //ArgumentList *tArgList; //!< template argument lists (for each scope) + //ArgumentList *mtArgList; //!< member template argument list QCString scopeSpec; //!< template specialization of the scope QCString memberSpec; //!< template specialization of the member QCString program; //!< the program text diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 57ce664..117b8ac 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -44,6 +44,7 @@ static const char *defaultStyleSheet = "A.elRef { font-weight: bold }\n" "A.code { text-decoration: none; font-weight: normal; color: #4444ee }\n" "A.codeRef { font-weight: normal; color: #4444ee }\n" + "A:hover { text-decoration: none; background-color: #f2f2ff }\n" "DL.el { margin-left: -1cm }\n" "DIV.fragment { width: 100%; border: none; background-color: #eeeeee }\n" "DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }\n" diff --git a/src/index.cpp b/src/index.cpp index 97957fe..624e190 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -2703,6 +2703,8 @@ void writeIndex(OutputList &ol) ol.startIndexSection(isTitlePageAuthor); parseText(ol,theTranslator->trGeneratedBy()); ol.endIndexSection(isTitlePageAuthor); + ol.enable(OutputGenerator::Latex); + if (Doxygen::mainPage) { ol.startIndexSection(isMainPage); @@ -2716,7 +2718,6 @@ void writeIndex(OutputList &ol) } ol.endIndexSection(isMainPage); } - ol.enable(OutputGenerator::Latex); if (documentedPackages>0) diff --git a/src/language.cpp b/src/language.cpp index 87e4c13..4f804f2 100644 --- a/src/language.cpp +++ b/src/language.cpp @@ -43,6 +43,7 @@ #include "translator_br.h" #include "translator_dk.h" #include "translator_sk.h" +#include "translator_ua.h" #endif #define L_EQUAL(a) !stricmp(langName,a) @@ -144,6 +145,10 @@ bool setTranslator(const char *langName) { theTranslator=new TranslatorSlovak; } + else if (L_EQUAL("ukrainian")) + { + theTranslator=new TranslatorUkrainian; + } #endif else // use the default language (i.e. english) { diff --git a/src/latexgen.cpp b/src/latexgen.cpp index e21e7d8..3031384 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -1235,10 +1235,11 @@ void LatexGenerator::writeSectionRefItem(const char *,const char *lab, //void LatexGenerator::docifyStatic(QTextStream &t,const char *str) void LatexGenerator::docify(const char *str) { - static bool isCzech = theTranslator->idLanguage()=="czech"; - static bool isJapanese = theTranslator->idLanguage()=="japanese"; - static bool isKorean = theTranslator->idLanguage()=="korean"; - static bool isRussian = theTranslator->idLanguage()=="russian"; + static bool isCzech = theTranslator->idLanguage()=="czech"; + static bool isJapanese = theTranslator->idLanguage()=="japanese"; + static bool isKorean = theTranslator->idLanguage()=="korean"; + static bool isRussian = theTranslator->idLanguage()=="russian"; + static bool isUkrainian = theTranslator->idLanguage()=="ukrainian"; if (str) { const unsigned char *p=(const unsigned char *)str; @@ -1321,7 +1322,7 @@ void LatexGenerator::docify(const char *str) t << (char)c; } } - else if (isCzech || isRussian) + else if (isCzech || isRussian || isUkrainian) { if (c>=128) { diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in index c86e343..1a6de48 100644 --- a/src/libdoxygen.pro.in +++ b/src/libdoxygen.pro.in @@ -91,7 +91,8 @@ HEADERS = bufstr.h \ treeview.h \ unistd.h \ util.h \ - version.h + version.h \ + xmlgen.h SOURCES = ce_lex.cpp \ ce_parse.cpp \ classdef.cpp \ @@ -141,9 +142,11 @@ SOURCES = ce_lex.cpp \ tagreader.cpp \ translator.cpp \ util.cpp \ - version.cpp + version.cpp \ + xmlgen.cpp -win32:TMAKE_CXXFLAGS += -DQT_NODLL -Zm200 +win32:TMAKE_CXXFLAGS += -DQT_NODLL +win32-msvc:TMAKE_CXXFLAGS += -Zm200 INCLUDEPATH += ../qtools win32:INCLUDEPATH += . DESTDIR = ../lib diff --git a/src/main.cpp b/src/main.cpp index 0406802..1c33296 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -31,6 +31,7 @@ int main(int argc,char **argv) { initDoxygen(); + readConfiguration(argc,argv); parseInput(); generateOutput(); diff --git a/src/memberdef.cpp b/src/memberdef.cpp index bcefdf7..a91f821 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -79,10 +79,10 @@ static void writeDefArgumentList(OutputList &ol,ClassDef *cd, ol.endMemberDocName(); Argument *a=argList->first(); QCString cName; - if (md->scopeDefTemplateArguments()) - { - cName=tempArgListToString(md->scopeDefTemplateArguments()); - } + //if (md->scopeDefTemplateArguments()) + //{ + // cName=tempArgListToString(md->scopeDefTemplateArguments()); + //} if (cd) { cName=cd->name(); @@ -245,8 +245,9 @@ MemberDef::MemberDef(const char *df,int dl, enumFields=0; enumScope=0; enumDeclList=0; - scopeTAL=0; - membTAL=0; + //scopeTAL=0; + //membTAL=0; + m_defTmpArgLists=0; initLines=0; type=t; args=a; @@ -320,6 +321,7 @@ MemberDef::~MemberDef() delete enumFields; delete argList; delete tArgList; + delete m_defTmpArgLists; } void MemberDef::insertReimplementedBy(MemberDef *md) @@ -385,38 +387,34 @@ QCString MemberDef::getOutputFileBase() const return "dummy"; } -static void copyArgumentList(const ArgumentList *src,ArgumentList *dst) -{ - ArgumentListIterator tali(*src); - Argument *a; - for (;(a=tali.current());++tali) - { - dst->append(new Argument(*a)); - } - dst->constSpecifier = src->constSpecifier; - dst->volatileSpecifier = src->volatileSpecifier; - dst->pureSpecifier = src->pureSpecifier; -} +//void MemberDef::setScopeDefTemplateArguments(ArgumentList *tal) +//{ +// // copy function arguments (if any) +// if (tal) +// { +// scopeTAL = new ArgumentList; +// scopeTAL->setAutoDelete(TRUE); +// copyArgumentList(tal,scopeTAL); +// } +//} +// +//void MemberDef::setMemberDefTemplateArguments(ArgumentList *tal) +//{ +// // copy function arguments (if any) +// if (tal) +// { +// membTAL = new ArgumentList; +// membTAL->setAutoDelete(TRUE); +// copyArgumentList(tal,membTAL); +// } +//} -void MemberDef::setScopeDefTemplateArguments(ArgumentList *tal) +void MemberDef::setDefinitionTemplateParameterLists(QList<ArgumentList> *lists) { - // copy function arguments (if any) - if (tal) + if (lists) { - scopeTAL = new ArgumentList; - scopeTAL->setAutoDelete(TRUE); - copyArgumentList(tal,scopeTAL); - } -} - -void MemberDef::setMemberDefTemplateArguments(ArgumentList *tal) -{ - // copy function arguments (if any) - if (tal) - { - membTAL = new ArgumentList; - membTAL->setAutoDelete(TRUE); - copyArgumentList(tal,membTAL); + if (m_defTmpArgLists) delete m_defTmpArgLists; + m_defTmpArgLists = copyArgumentLists(lists); } } @@ -633,10 +631,7 @@ void MemberDef::writeDeclaration(OutputList &ol, if (tArgList) { writeTemplatePrefix(ol,tArgList); - } - else if (membTAL) - { - writeTemplatePrefix(ol,membTAL); + ol.lineBreak(); } QCString ltype(type); @@ -979,43 +974,50 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, } ClassDef *cd=getClassDef(); - ArgumentList *scopeAl=scopeDefTemplateArguments(); - if (scopeAl==0 && cd) scopeAl=cd->templateArguments(); - - ArgumentList *membAl=memberDefTemplateArguments(); - if (membAl==0) membAl=templateArguments(); - if (!Config_getBool("HIDE_SCOPE_NAMES")) { - if (scopeAl && !related) // class template prefix - { - ol.startMemberDocPrefixItem(); - writeTemplatePrefix(ol,scopeAl); - ol.endMemberDocPrefixItem(); - } - if (scopeAl && membAl) ol.docify(" "); - - if (membAl) // function template prefix + bool first=TRUE; + if (m_defTmpArgLists) + // definition has explicate template parameter declarations { - ol.startMemberDocPrefixItem(); - writeTemplatePrefix(ol,membAl); - ol.endMemberDocPrefixItem(); + QListIterator<ArgumentList> ali(*m_defTmpArgLists); + ArgumentList *tal; + for (ali.toFirst();(tal=ali.current());++ali) + { + if (tal->count()>0) + { + if (!first) ol.docify(" "); + ol.startMemberDocPrefixItem(); + writeTemplatePrefix(ol,tal); + ol.endMemberDocPrefixItem(); + } + } } - if (cd) + else { - QCString cName=cd->name(); - int il=cName.find('<'); - int ir=cName.findRev('>'); - if (il!=-1 && ir!=-1 && ir>il) + if (cd) { - ldef=addTemplateNames(ldef, - cName.left(il), /* class without template spec */ - cName.mid(il,ir-il+1) /* templ spec */ - ); + QList<ArgumentList> tempParamLists; + cd->getTemplateParameterLists(tempParamLists); + //printf("#tempParamLists=%d\n",tempParamLists.count()); + QListIterator<ArgumentList> ali(tempParamLists); + ArgumentList *tal; + for (ali.toFirst();(tal=ali.current());++ali) + { + if (tal->count()>0) + { + if (!first) ol.docify(" "); + ol.startMemberDocPrefixItem(); + writeTemplatePrefix(ol,tal); + ol.endMemberDocPrefixItem(); + } + } } - else if (scopeAl) + if (tArgList) // function template prefix { - ldef=addTemplateNames(ldef,cName,tempArgListToString(scopeAl)); + ol.startMemberDocPrefixItem(); + writeTemplatePrefix(ol,tArgList); + ol.endMemberDocPrefixItem(); } } } @@ -1492,6 +1494,7 @@ QCString MemberDef::getScopeString() const QCString MemberDef::anchor() const { + if (m_templateMaster) return m_templateMaster->anchor(); if (enumScope) return enumScope->anchor()+anc; return anc; } diff --git a/src/memberdef.h b/src/memberdef.h index 5a2e279..6fa3b37 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -101,7 +101,6 @@ class MemberDef : public Definition Specifier virtualness() const { return virt; } MemberType memberType() const { return mtype; } - // convenience methods bool isSignal() const { return mtype==Signal; } bool isSlot() const { return mtype==Slot; } @@ -197,10 +196,13 @@ class MemberDef : public Definition argList = al; } ArgumentList *templateArguments() const { return tArgList; } - void setScopeDefTemplateArguments(ArgumentList *t); - ArgumentList *scopeDefTemplateArguments() const { return scopeTAL; } - void setMemberDefTemplateArguments(ArgumentList *t); - ArgumentList *memberDefTemplateArguments() const { return membTAL; } + //void setScopeDefTemplateArguments(ArgumentList *t); + //ArgumentList *scopeDefTemplateArguments() const { return scopeTAL; } + //void setMemberDefTemplateArguments(ArgumentList *t); + //ArgumentList *memberDefTemplateArguments() const { return membTAL; } + void setDefinitionTemplateParameterLists(QList<ArgumentList> *lists); + QList<ArgumentList> *definitionTemplateParameterLists() const + { return m_defTmpArgLists; } // namespace related members void setNamespace(NamespaceDef *nd); @@ -275,8 +277,9 @@ class MemberDef : public Definition MemberDef *annMemb; ArgumentList *argList; // argument list of this member ArgumentList *tArgList; // template argument list of function template - ArgumentList *scopeTAL; // template argument list of class template - ArgumentList *membTAL; // template argument list of class template + //ArgumentList *scopeTAL; // template argument list of class template + //ArgumentList *membTAL; // template argument list of class template + QList<ArgumentList> *m_defTmpArgLists; int grpId; // group id MemberGroup *memberGroup; // group's member definition @@ -1519,8 +1519,9 @@ BN [ \t\r\n] g_defVarArgs = yytext[yyleng-1]=='.'; if (g_defVarArgs) // strip ellipsis { - argName=argName.left(argName.length()-3).stripWhiteSpace(); + argName=argName.left(argName.length()-3); } + argName = argName.stripWhiteSpace(); g_defArgsStr+=yytext; g_argDict->insert(argName,new int(g_defArgs)); g_defArgs++; diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index e3345ca..4605ae6 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -1085,7 +1085,7 @@ void RTFGenerator::endIndexSection(IndexSections is) if (logoFilename) { t << "{\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE " << logoFilename; - t << " \\\\*MERGEFORMAT} {\\fldrslt IMAGE }}\\par\\par\n"; + t << " \\\\d \\\\*MERGEFORMAT} {\\fldrslt IMAGE }}\\par\\par\n"; } if (company) { @@ -2110,7 +2110,7 @@ void RTFGenerator::endClassDiagram(ClassDiagram &d, t << Rtf_Style_Reset << endl; t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE "; t << fileName << ".gif"; - t << " \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; + t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; t << "}" << endl; } @@ -2200,7 +2200,7 @@ void RTFGenerator::startImage(const char *name,const char *,bool) t << Rtf_Style_Reset << endl; t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE "; t << name; - t << " \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; + t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; t << "}" << endl; } @@ -2551,7 +2551,7 @@ void RTFGenerator::endDotGraph(DotClassGraph &g) t << Rtf_Style_Reset << endl; t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE "; t << fileName << ".gif"; - t << " \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; + t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; t << "}" << endl; } @@ -2570,7 +2570,7 @@ void RTFGenerator::endInclDepGraph(DotInclDepGraph &g) t << Rtf_Style_Reset << endl; t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE "; t << fileName << ".gif"; - t << " \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; + t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; t << "}" << endl; } diff --git a/src/scanner.l b/src/scanner.l index eba34de..54128b2 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -362,6 +362,39 @@ static void setContext() insideJava = fileName.right(5)==".java"; } +static void prependScope() +{ + if (current_root->section & Entry::SCOPE_MASK) + { + //printf("--- prependScope %s to %s\n",current_root->name.data(),current->name.data()); + current->name.prepend(current_root->name+"::"); + if (current_root->tArgLists) + { + if (current->tArgLists==0) + { + current->tArgLists = new QList<ArgumentList>; + current->tArgLists->setAutoDelete(TRUE); + } + //printf("prependScope #=%d #current=%d\n",current_root->tArgLists->count(),current->tArgLists->count()); + QListIterator<ArgumentList> talsi(*current_root->tArgLists); + ArgumentList *srcAl=0; + for (talsi.toLast();(srcAl=talsi.current());--talsi) + { + ArgumentList *dstAl = new ArgumentList; + dstAl->setAutoDelete(TRUE); + QListIterator<Argument> tali(*srcAl); + Argument *a; + for (;(a=tali.current());++tali) + { + dstAl->append(new Argument(*a)); + //printf("appending argument %s %s\n",a->type.data(),a->name.data()); + } + current->tArgLists->insert(0,dstAl); + } + } + } +} + /* ----------------------------------------------------------------- */ #undef YY_INPUT #define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size); @@ -793,15 +826,15 @@ TITLE [tT][iI][tT][lL][eE] current->fileName = yyFileName; current->startLine = yyLineNr; current->bodyLine = yyLineNr; - if (current->mtArgList) // transfer template arguments - { - if (current->tArgList) - { - delete current->tArgList; - } - current->tArgList = current->mtArgList; - current->mtArgList = 0; - } + //if (current->mtArgList) // transfer template arguments + //{ + // if (current->tArgList) + // { + // delete current->tArgList; + // } + // current->tArgList = current->mtArgList; + // current->mtArgList = 0; + //} lineCount() ; BEGIN( CompoundName ) ; } @@ -813,15 +846,15 @@ TITLE [tT][iI][tT][lL][eE] current->fileName = yyFileName; current->startLine = yyLineNr; current->bodyLine = yyLineNr; - if (current->mtArgList) // transfer template arguments - { - if (current->tArgList) - { - delete current->tArgList; - } - current->tArgList = current->mtArgList; - current->mtArgList = 0; - } + //if (current->mtArgList) // transfer template arguments + //{ + // if (current->tArgList) + // { + // delete current->tArgList; + // } + // current->tArgList = current->mtArgList; + // current->mtArgList = 0; + //} lineCount() ; BEGIN( CompoundName ) ; } @@ -870,18 +903,27 @@ TITLE [tT][iI][tT][lL][eE] //if (current->tArgList /*|| (current_root->section&Entry::COMPOUND_MASK)*/) //{ // printf("-------> member template \n"); - if (current->mtArgList) - { - if (current->tArgList) - { - delete current->tArgList; - } - current->tArgList = current->mtArgList; - current->mtArgList = 0; - } - current->mtArgList = new ArgumentList; - current->mtArgList->setAutoDelete(TRUE); - currentArgumentList = current->mtArgList; + if (current->tArgLists==0) + { + current->tArgLists = new QList<ArgumentList>; + current->tArgLists->setAutoDelete(TRUE); + } + ArgumentList *al = new ArgumentList; + al->setAutoDelete(TRUE); + current->tArgLists->append(al); + currentArgumentList = al; + //if (current->mtArgList) + // { + // if (current->tArgList) + // { + // delete current->tArgList; + // } + // current->tArgList = current->mtArgList; + // current->mtArgList = 0; + // } + // current->mtArgList = new ArgumentList; + // current->mtArgList->setAutoDelete(TRUE); + // currentArgumentList = current->mtArgList; //} //else // class template specifier //{ @@ -961,11 +1003,11 @@ TITLE [tT][iI][tT][lL][eE] sharpCount=0; lineCount(); addType( current ); - if (current->mtArgList && current->tArgList==0) - { - current->tArgList=current->mtArgList; - current->mtArgList=0; - } + //if (current->mtArgList && current->tArgList==0) + //{ + // current->tArgList=current->mtArgList; + // current->mtArgList=0; + //} current->name=yytext; current->name=current->name.stripWhiteSpace(); current->scopeSpec.resize(0); @@ -1039,12 +1081,12 @@ TITLE [tT][iI][tT][lL][eE] // correct for misinterpreting return type as scope name: example: A<T> func() //printf("YY_START=%d current->tArgList=%p current->mtArgList=%p\n", // YY_START,current->tArgList,current->mtArgList); - if (YY_START==FindMembers /*&& current->tArgList*/ && current->mtArgList==0) - { - current->mtArgList=current->tArgList; - current->tArgList=0; - current->scopeSpec.resize(0); - } + //if (YY_START==FindMembers /*&& current->tArgList*/ && current->mtArgList==0) + //{ + // current->mtArgList=current->tArgList; + // current->tArgList=0; + // current->scopeSpec.resize(0); + //} lineCount(); if (insideIDL && yyleng==9 && strcmp(yytext,"cpp_quote")==0) { @@ -1563,10 +1605,10 @@ TITLE [tT][iI][tT][lL][eE] QCString &cn = current->name; QCString rn = current_root->name.copy(); //printf("cn=`%s' rn=`%s'\n",cn.data(),rn.data()); - if (!cn.isEmpty() && !rn.isEmpty() && - (current_root->section & Entry::SCOPE_MASK)) + if (!cn.isEmpty() && !rn.isEmpty()) { - cn.prepend(rn+"::"); + prependScope(); + //cn.prepend(rn+"::"); } if (isTypedef && cn.isEmpty()) { @@ -1608,10 +1650,7 @@ TITLE [tT][iI][tT][lL][eE] current->program+=","; // add field terminator } current->name=yytext; - if (current_root->section & Entry::SCOPE_MASK) - { - current->name.prepend(current_root->name+"::"); - } + prependScope(); current->args = current->args.simplifyWhiteSpace(); current->type = current->type.simplifyWhiteSpace(); //printf("Adding compound %s %s %s\n",current->type.data(),current->name.data(),current->args.data()); @@ -2934,20 +2973,14 @@ TITLE [tT][iI][tT][lL][eE] <ClassDocArg1>{SCOPENAME}/"<" { current->name = yytext; // prepend outer scope name - if (current_root->section & Entry::SCOPE_MASK) - { - current->name.prepend(current_root->name+"::"); - } + prependScope(); lastClassTemplSpecContext = ClassDocArg2; BEGIN( ClassTemplSpec ); } <ClassDocArg1>{SCOPENAME} { current->name = yytext; // prepend outer scope name - if (current_root->section & Entry::SCOPE_MASK) - { - current->name.prepend(current_root->name+"::"); - } + prependScope(); BEGIN( ClassDocArg2 ); } <ClassDocArg1>"\\"{B}*"\n" { yyLineNr++; } @@ -3045,10 +3078,7 @@ TITLE [tT][iI][tT][lL][eE] } <EnumDocArg1>{SCOPEID} { current->name = yytext; - if (current_root->section & Entry::SCOPE_MASK) - { - current->name.prepend(current_root->name+"::"); - } + prependScope(); newDocState(); } <EnumDocArg1>"\\"{B}*"\n" { yyLineNr++; } @@ -3859,16 +3889,6 @@ static void parseCompounds(Entry *rt) memberGroupId = NOGROUP; - // rebuild compound's group context - //QCString *s = ce->groups->first(); - //if (s) - //{ - // lastDefGroup=*s; - // startGroup(); - //} - - //current->mGrpId = memberGroupId = ce->mGrpId; - scanYYlex() ; delete current; current=0; ce->program.resize(0); diff --git a/src/tagreader.cpp b/src/tagreader.cpp index 26b2b0a..3425132 100644 --- a/src/tagreader.cpp +++ b/src/tagreader.cpp @@ -146,7 +146,8 @@ class TagFileParser : public QXmlDefaultHandler InGroup, InPage, InMember, - InPackage + InPackage, + InTempArgList }; class StartElementHandler { @@ -290,6 +291,7 @@ class TagFileParser : public QXmlDefaultHandler m_stateStack.push(new State(m_state)); m_state = InMember; } + void endMember() { m_state = *m_stateStack.pop(); @@ -303,6 +305,8 @@ class TagFileParser : public QXmlDefaultHandler default: err("Error: Unexpected tag `member' found\n"); break; } } + + void endDocAnchor() { switch(m_state) @@ -531,24 +535,24 @@ class TagFileParser : public QXmlDefaultHandler m_tagFilePages.setAutoDelete(TRUE); m_tagFilePackages.setAutoDelete(TRUE); - m_startElementHandlers.insert("compound", new StartElementHandler(this,&TagFileParser::startCompound)); - m_startElementHandlers.insert("member", new StartElementHandler(this,&TagFileParser::startMember)); - m_startElementHandlers.insert("name", new StartElementHandler(this,&TagFileParser::startStringValue)); - m_startElementHandlers.insert("base", new StartElementHandler(this,&TagFileParser::startBase)); - m_startElementHandlers.insert("filename", new StartElementHandler(this,&TagFileParser::startStringValue)); - m_startElementHandlers.insert("path", new StartElementHandler(this,&TagFileParser::startStringValue)); - m_startElementHandlers.insert("anchor", new StartElementHandler(this,&TagFileParser::startStringValue)); - m_startElementHandlers.insert("arglist", new StartElementHandler(this,&TagFileParser::startStringValue)); - m_startElementHandlers.insert("title", new StartElementHandler(this,&TagFileParser::startStringValue)); - m_startElementHandlers.insert("subgroup", new StartElementHandler(this,&TagFileParser::startStringValue)); - m_startElementHandlers.insert("class", new StartElementHandler(this,&TagFileParser::startStringValue)); - m_startElementHandlers.insert("namespace", new StartElementHandler(this,&TagFileParser::startStringValue)); - m_startElementHandlers.insert("file", new StartElementHandler(this,&TagFileParser::startStringValue)); - m_startElementHandlers.insert("page", new StartElementHandler(this,&TagFileParser::startStringValue)); - m_startElementHandlers.insert("docanchor", new StartElementHandler(this,&TagFileParser::startStringValue)); - m_startElementHandlers.insert("tagfile", new StartElementHandler(this,&TagFileParser::startIgnoreElement)); - m_startElementHandlers.insert("templarg", new StartElementHandler(this,&TagFileParser::startStringValue)); - m_startElementHandlers.insert("type", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("compound", new StartElementHandler(this,&TagFileParser::startCompound)); + m_startElementHandlers.insert("member", new StartElementHandler(this,&TagFileParser::startMember)); + m_startElementHandlers.insert("name", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("base", new StartElementHandler(this,&TagFileParser::startBase)); + m_startElementHandlers.insert("filename", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("path", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("anchor", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("arglist", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("title", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("subgroup", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("class", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("namespace", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("file", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("page", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("docanchor", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("tagfile", new StartElementHandler(this,&TagFileParser::startIgnoreElement)); + m_startElementHandlers.insert("templarg", new StartElementHandler(this,&TagFileParser::startStringValue)); + m_startElementHandlers.insert("type", new StartElementHandler(this,&TagFileParser::startStringValue)); m_endElementHandlers.insert("compound", new EndElementHandler(this,&TagFileParser::endCompound)); m_endElementHandlers.insert("member", new EndElementHandler(this,&TagFileParser::endMember)); @@ -663,22 +667,22 @@ class TagFileErrorHandler : public QXmlErrorHandler /*! Dumps the internal structures. For debugging only! */ void TagFileParser::dump() { - printf("Result:\n"); + msg("Result:\n"); QListIterator<TagClassInfo> lci(m_tagFileClasses); //============== CLASSES TagClassInfo *cd; for (;(cd=lci.current());++lci) { - printf("class `%s'\n",cd->name.data()); - printf(" filename `%s'\n",cd->filename.data()); + msg("class `%s'\n",cd->name.data()); + msg(" filename `%s'\n",cd->filename.data()); if (cd->bases) { QListIterator<BaseInfo> bii(*cd->bases); BaseInfo *bi; for ( bii.toFirst() ; (bi=bii.current()) ; ++bii) { - printf( " base: %s \n", bi->name.data() ); + msg( " base: %s \n", bi->name.data() ); } } @@ -686,11 +690,11 @@ void TagFileParser::dump() TagMemberInfo *md; for (;(md=mci.current());++mci) { - printf(" member:\n"); - printf(" kind: `%s'\n",md->kind.data()); - printf(" name: `%s'\n",md->name.data()); - printf(" anchor: `%s'\n",md->anchor.data()); - printf(" arglist: `%s'\n",md->arglist.data()); + msg(" member:\n"); + msg(" kind: `%s'\n",md->kind.data()); + msg(" name: `%s'\n",md->name.data()); + msg(" anchor: `%s'\n",md->anchor.data()); + msg(" arglist: `%s'\n",md->arglist.data()); } } //============== NAMESPACES @@ -698,24 +702,24 @@ void TagFileParser::dump() TagNamespaceInfo *nd; for (;(nd=lni.current());++lni) { - printf("namespace `%s'\n",nd->name.data()); - printf(" filename `%s'\n",nd->filename.data()); + msg("namespace `%s'\n",nd->name.data()); + msg(" filename `%s'\n",nd->filename.data()); QStringList::Iterator it; for ( it = nd->classList.begin(); it != nd->classList.end(); ++it ) { - printf( " class: %s \n", (*it).latin1() ); + msg( " class: %s \n", (*it).latin1() ); } QListIterator<TagMemberInfo> mci(nd->members); TagMemberInfo *md; for (;(md=mci.current());++mci) { - printf(" member:\n"); - printf(" kind: `%s'\n",md->kind.data()); - printf(" name: `%s'\n",md->name.data()); - printf(" anchor: `%s'\n",md->anchor.data()); - printf(" arglist: `%s'\n",md->arglist.data()); + msg(" member:\n"); + msg(" kind: `%s'\n",md->kind.data()); + msg(" name: `%s'\n",md->name.data()); + msg(" anchor: `%s'\n",md->anchor.data()); + msg(" arglist: `%s'\n",md->arglist.data()); } } //============== FILES @@ -723,29 +727,29 @@ void TagFileParser::dump() TagFileInfo *fd; for (;(fd=lfi.current());++lfi) { - printf("file `%s'\n",fd->name.data()); - printf(" filename `%s'\n",fd->filename.data()); + msg("file `%s'\n",fd->name.data()); + msg(" filename `%s'\n",fd->filename.data()); QStringList::Iterator it; for ( it = fd->namespaceList.begin(); it != fd->namespaceList.end(); ++it ) { - printf( " namespace: %s \n", (*it).latin1() ); + msg( " namespace: %s \n", (*it).latin1() ); } for ( it = fd->classList.begin(); it != fd->classList.end(); ++it ) { - printf( " class: %s \n", (*it).latin1() ); + msg( " class: %s \n", (*it).latin1() ); } QListIterator<TagMemberInfo> mci(fd->members); TagMemberInfo *md; for (;(md=mci.current());++mci) { - printf(" member:\n"); - printf(" kind: `%s'\n",md->kind.data()); - printf(" name: `%s'\n",md->name.data()); - printf(" anchor: `%s'\n",md->anchor.data()); - printf(" arglist: `%s'\n",md->arglist.data()); + msg(" member:\n"); + msg(" kind: `%s'\n",md->kind.data()); + msg(" name: `%s'\n",md->name.data()); + msg(" anchor: `%s'\n",md->anchor.data()); + msg(" arglist: `%s'\n",md->arglist.data()); } } @@ -754,44 +758,44 @@ void TagFileParser::dump() TagGroupInfo *gd; for (;(gd=lgi.current());++lgi) { - printf("group `%s'\n",gd->name.data()); - printf(" filename `%s'\n",gd->filename.data()); + msg("group `%s'\n",gd->name.data()); + msg(" filename `%s'\n",gd->filename.data()); QStringList::Iterator it; for ( it = gd->namespaceList.begin(); it != gd->namespaceList.end(); ++it ) { - printf( " namespace: %s \n", (*it).latin1() ); + msg( " namespace: %s \n", (*it).latin1() ); } for ( it = gd->classList.begin(); it != gd->classList.end(); ++it ) { - printf( " class: %s \n", (*it).latin1() ); + msg( " class: %s \n", (*it).latin1() ); } for ( it = gd->fileList.begin(); it != gd->fileList.end(); ++it ) { - printf( " file: %s \n", (*it).latin1() ); + msg( " file: %s \n", (*it).latin1() ); } for ( it = gd->subgroupList.begin(); it != gd->subgroupList.end(); ++it ) { - printf( " subgroup: %s \n", (*it).latin1() ); + msg( " subgroup: %s \n", (*it).latin1() ); } for ( it = gd->pageList.begin(); it != gd->pageList.end(); ++it ) { - printf( " page: %s \n", (*it).latin1() ); + msg( " page: %s \n", (*it).latin1() ); } QListIterator<TagMemberInfo> mci(gd->members); TagMemberInfo *md; for (;(md=mci.current());++mci) { - printf(" member:\n"); - printf(" kind: `%s'\n",md->kind.data()); - printf(" name: `%s'\n",md->name.data()); - printf(" anchor: `%s'\n",md->anchor.data()); - printf(" arglist: `%s'\n",md->arglist.data()); + msg(" member:\n"); + msg(" kind: `%s'\n",md->kind.data()); + msg(" name: `%s'\n",md->name.data()); + msg(" anchor: `%s'\n",md->anchor.data()); + msg(" arglist: `%s'\n",md->arglist.data()); } } //============== PAGES @@ -799,9 +803,9 @@ void TagFileParser::dump() TagPageInfo *pd; for (;(pd=lpi.current());++lpi) { - printf("page `%s'\n",pd->name.data()); - printf(" title `%s'\n",pd->title.data()); - printf(" filename `%s'\n",pd->filename.data()); + msg("page `%s'\n",pd->name.data()); + msg(" title `%s'\n",pd->title.data()); + msg(" filename `%s'\n",pd->filename.data()); } } @@ -973,14 +977,17 @@ void TagFileParser::buildLists(Entry *root) } if (tci->templateArguments) { - if (ce->tArgList==0) ce->tArgList = new ArgumentList; + if (ce->tArgLists==0) ce->tArgLists = new QList<ArgumentList>; + ArgumentList *al = new ArgumentList; + ce->tArgLists->append(al); + QListIterator<QString> sli(*tci->templateArguments); QString *argName; for (;(argName=sli.current());++sli) { Argument *a = new Argument; a->name = *argName; - ce->tArgList->append(a); + al->append(a); } } diff --git a/src/translator.cpp b/src/translator.cpp index 1cb3040..3cce9df 100644 --- a/src/translator.cpp +++ b/src/translator.cpp @@ -1,6 +1,15 @@ +/*! \file translator.cpp + * \brief Implementation of generally used translator methods. + * + * This file contains implementation of the translator methods that + * are not expected to be reimplemented by derived translator classes. + * It also contains static data tables used by the methods. + * + */ #include "translator.h" -const char Translator::WinToISOTab[] = +/*! The translation table used by Win1250ToISO88592() method. */ +const char Translator::Win1250ToISO88592Tab[] = { '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87', '\x88', '\x89', '\xA9', '\x8B', '\xA6', '\xAB', '\xAE', '\xAC', @@ -22,7 +31,8 @@ const char Translator::WinToISOTab[] = }; -const char Translator::ISOToWinTab[] = { +/*! The translation table used by ISO88592ToWin1250() method. */ +const char Translator::ISO88592ToWin1250Tab[] = { '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87', '\x88', '\x89', '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F', '\x90', '\x91', '\x92', '\x93', '\x94', '\x95', '\x96', '\x97', @@ -42,7 +52,9 @@ const char Translator::ISOToWinTab[] = { '\0' }; -Q_UINT16 Translator::koi8_r[128] = + +/*! The translation table used by Koi8RToWindows1251() method. */ +Q_UINT16 Translator::Koi8RToWindows1251Tab[128] = { 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524, 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590, 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219/**/, 0x221A, 0x2248, @@ -62,7 +74,8 @@ Q_UINT16 Translator::koi8_r[128] = }; -Q_UINT16 Translator::windows_1251[128] = +/*! The translation table used by Windows1251ToKoi8R() method. */ +Q_UINT16 Translator::Windows1251ToKoi8RTab[128] = { 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, @@ -82,3 +95,99 @@ Q_UINT16 Translator::windows_1251[128] = }; +/*! Returns the string converted from windows-1250 to iso-8859-2. */ +/* The method was designed initially for translator_cz.h. + * It is used for on-line encoding conversion related to + * conditional compilation in Unix/MS Windows environments + * (both use different encoding). Later, the translator_hr.h + * (by Boris Bralo) used and improved the same style. As the + * method with the translation table was the same, the + * decision to move it to this base class was made. The same + * holds for ISO88592ToWin1250() method. + * + * Alexandr Chelpanov used the same approach for + * Koi8RToWindows1251() and Windows1251ToKoi8R() methods. Notice, + * that he uses Unicode tables. + * + * It is recommended for possibly other similar methods in future. + */ +QCString Translator::Win1250ToISO88592(const QCString & sInput) +{ + // The conversion table for characters >127 + // + + QCString result; + int len = sInput.length(); + + for (int i = 0; i < len; ++i) + { + unsigned int c = sInput[i]; + result += (c > 127) ? Win1250ToISO88592Tab[c & 0x7F] : c; + } + return result; +} + + +/*! returns the string converted from iso-8859-2 to windows-1250 */ +/* See the comments of the Win1250ToISO88592() method for details. */ +QCString Translator::ISO88592ToWin1250(const QCString & sInput) +{ + // The conversion table for characters >127 + // + QCString result; + int len = sInput.length(); + + for (int i = 0; i < len; ++i) + { + unsigned int c = sInput[i]; + result += (c > 127) ? ISO88592ToWin1250Tab[c & 0x7F] : c; + } + return result; +} + + +/*! Returns the string converted from koi8-r to windows-1251. */ +/* The method was designed initially for translator_cz.h. + It is used for on-line encoding conversion related to conditional + compilation in Unix/MS Windows environments (both use different + encoding). Encoding table got from QT:qtextcodec.cpp + */ +QCString Translator::Koi8RToWindows1251( const QCString & sInput ) +{ + + QString result; + int len = sInput.length(); + + result.setUnicode(0, len); + QChar* uc = (QChar*)result.unicode(); // const_cast + const unsigned char * c = (const unsigned char *)(const char*)sInput; + for( int i=0; i<len; i++ ) { + if ( c[i] > 127 ) + uc[i] = Koi8RToWindows1251Tab[c[i]-128]; + else + uc[i] = c[i]; + } + return result.local8Bit(); +} + + +/*! returns the string converted from Windows-1251 to koi8-r */ +/* See the comments of the Koi8RToWindows1251() method for details. + Encoding table got from QT:qtextcodec.cpp */ +QCString Translator::Windows1251ToKoi8R( const QCString & sInput ) +{ + QString result; + int len = sInput.length(); + + result.setUnicode(0, len); + QChar* uc = (QChar*)result.unicode(); // const_cast + const unsigned char * c = (const unsigned char *)(const char*)sInput; + for( int i=0; i<len; i++ ) { + if ( c[i] > 127 ) + uc[i] = Windows1251ToKoi8RTab[c[i]-128]; + else + uc[i] = c[i]; + } + return result.local8Bit(); +} + diff --git a/src/translator.h b/src/translator.h index 852b997..c216deb 100644 --- a/src/translator.h +++ b/src/translator.h @@ -25,103 +25,25 @@ class Translator { + private: + /* Tables for encoding conversions. */ + static const char Win1250ToISO88592Tab[]; + static const char ISO88592ToWin1250Tab[]; + static Q_UINT16 Koi8RToWindows1251Tab[128]; + static Q_UINT16 Windows1251ToKoi8RTab[128]; + protected: - static const char WinToISOTab[]; - static const char ISOToWinTab[]; - static Q_UINT16 koi8_r[128]; - static Q_UINT16 windows_1251[128]; /*! Returns the string converted from windows-1250 to iso-8859-2. */ - /* The method was designed initially for translator_cz.h. - * It is used for on-line encoding conversion related to - * conditional compilation in Unix/MS Windows environments - * (both use different encoding). Later, the translator_hr.h - * (by Boris Bralo) used and improved the same style. As the - * method with the translation table was the same, the - * decision to move it to this base class was made. The same - * holds for ISO88592ToWin1250() method. - * - * Alexandr Chelpanov used the same approach for - * Koi8RToWindows1251() and Windows1251ToKoi8R() methods. Notice, - * that he uses Unicode tables. - * - * It is recommended for possibly other similar methods in future. - */ - QCString Win1250ToISO88592(const QCString & sInput) - { - // The conversion table for characters >127 - // - - QCString result; - int len = sInput.length(); - - for (int i = 0; i < len; ++i) - { - unsigned int c = sInput[i]; - result += (c > 127) ? WinToISOTab[c & 0x7F] : c; - } - return result; - } - - /*! returns the string converted from iso-8859-2 to windows-1250 */ - /* See the comments of the Win1250ToISO88592() method for details. */ - QCString ISO88592ToWin1250(const QCString & sInput) - { - // The conversion table for characters >127 - // - QCString result; - int len = sInput.length(); - - for (int i = 0; i < len; ++i) - { - unsigned int c = sInput[i]; - result += (c > 127) ? ISOToWinTab[c & 0x7F] : c; - } - return result; - } + QCString Win1250ToISO88592(const QCString & sInput); + + /*! Returns the string converted from iso-8859-2 to windows-1250. */ + QCString ISO88592ToWin1250(const QCString & sInput); /*! Returns the string converted from koi8-r to windows-1251. */ - /* The method was designed initially for translator_cz.h. - It is used for on-line encoding conversion related to conditional - compilation in Unix/MS Windows environments (both use different - encoding). - Encoding table got from QT:qtextcodec.cpp - */ - QCString Koi8RToWindows1251( const QCString & sInput ) - { - - QString result; - int len = sInput.length(); - - result.setUnicode(0, len); - QChar* uc = (QChar*)result.unicode(); // const_cast - const unsigned char * c = (const unsigned char *)(const char*)sInput; - for( int i=0; i<len; i++ ) { - if ( c[i] > 127 ) - uc[i] = koi8_r[c[i]-128]; - else - uc[i] = c[i]; - } - return result.local8Bit(); - } - /*! returns the string converted from Windows-1251 to koi8-r */ - /* See the comments of the Koi8RToWindows1251() method for details. - Encoding table got from QT:qtextcodec.cpp */ - QCString Windows1251ToKoi8R( const QCString & sInput ) - { - QString result; - int len = sInput.length(); - - result.setUnicode(0, len); - QChar* uc = (QChar*)result.unicode(); // const_cast - const unsigned char * c = (const unsigned char *)(const char*)sInput; - for( int i=0; i<len; i++ ) { - if ( c[i] > 127 ) - uc[i] = windows_1251[c[i]-128]; - else - uc[i] = c[i]; - } - return result.local8Bit(); - } + QCString Koi8RToWindows1251( const QCString & sInput ); + + /*! Returns the string converted from windows-1251 to koi8-r. */ + QCString Windows1251ToKoi8R( const QCString & sInput ); public: @@ -134,19 +56,15 @@ class Translator // --- Language control methods ------------------- - /*! Used for identification of the language. May resemble - * the string returned by latexBabelPackage(), but it is not used - * for the same purpose. The identification should not be translated. - * It should be replaced by the name of the language in English - * (e.g. Czech, Japanese, Russian, etc.). It should be equal to - * the identification in language.cpp. + /*! Used for identification of the language. + * See the comment for the translator_en.h method implementation + * for details. */ virtual QCString idLanguage() = 0; - /*! Used to get the command(s) for the language support. This method - * was designed for languages which do not prefer babel package. - * If this methods returns empty string, then the latexBabelPackage() - * method is used to generate the command for using the babel package. + /*! Used to get the command(s) for the language support. + * See the comment for the translator_en.h method implementation + * for details. */ virtual QCString latexLanguageSupportCommand() = 0; diff --git a/src/translator_cz.h b/src/translator_cz.h index 7fc8f1a..9ea3ba2 100644 --- a/src/translator_cz.h +++ b/src/translator_cz.h @@ -124,6 +124,10 @@ // - Updated misleading information in trLegendDocs(). // - The trReimplementedInList() updated to fit the context better. // - The trReimplementedFromList() updated to fit the context better. +// +// 2001/07/16 +// - trClassDocumentation() updated as in the English translator. +// // // Todo // ---- @@ -508,7 +512,16 @@ class TranslatorCzech : public Translator * the documentation of all classes, structs and unions. */ virtual QCString trClassDocumentation() - { return decode("Dokumentace tЬМd"); } + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return decode("Dokumentace datovЩch struktur"); + } + else + { + return decode("Dokumentace tЬМd"); + } + } /*! This is used in LaTeX as the title of the chapter containing * the documentation of all files. diff --git a/src/translator_pt.h b/src/translator_pt.h index ba0d0cc..a691b15 100644 --- a/src/translator_pt.h +++ b/src/translator_pt.h @@ -15,22 +15,60 @@ * * The translation into Portuguese was provided by * Rui Godinho Lopes <ruiglopes@yahoo.com> + * + * VERSION HISTORY + * --------------- + * 001 20 july 2001 + * - Updated for doxygen v1.2.8.1 + * 000 ? + * - Initial translation for doxygen v1.1.5 */ #ifndef TRANSLATOR_PT_H #define TRANSLATOR_PT_H -#include "translator_adapter.h" - -class TranslatorPortuguese : public TranslatorAdapter_1_1_5 +class TranslatorPortuguese : public Translator { public: + + // --- Language control methods ------------------- + + /*! Used for identification of the language. The identification + * should not be translated. It should be replaced by the name + * of the language in English using lower-case characters only + * (e.g. "czech", "japanese", "russian", etc.). It should be equal to + * the identification used in language.cpp. + */ QCString idLanguage() { return "portuguese"; } + + /*! Used to get the LaTeX command(s) for the language support. + * This method should return string with commands that switch + * LaTeX to the desired language. For example + * <pre>"\\usepackage[german]{babel}\n" + * </pre> + * or + * <pre>"\\usepackage{polski}\n" + * "\\usepackage[latin2]{inputenc}\n" + * "\\usepackage[T1]{fontenc}\n" + * </pre> + * + * The English LaTeX does not use such commands. Because of this + * the empty string is returned in this implementation. + */ + virtual QCString latexLanguageSupportCommand() + { return "Portuguese"; } + /*! returns the name of the package that is included by LaTeX */ QCString latexBabelPackage() { return "portuguese"; } + /*! return the language charset. This will be used for the HTML output */ + virtual QCString idLanguageCharset() + { return "iso-8859-1"; } + + // --- Language translation methods ------------------- + /*! used in the compound documentation before a list of related functions. */ QCString trRelatedFunctions() { return "FunГУes associadas"; } @@ -45,11 +83,11 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 /*! header that is put before the list of typedefs. */ QCString trMemberTypedefDocumentation() - { return "DocumentaГЦo de tipos definidos"; } + { return "DocumentaГЦo das definiГУes de tipo"; } /*! header that is put before the list of enumerations. */ QCString trMemberEnumerationDocumentation() - { return "DocumentaГЦo da enumeraГУes"; } + { return "DocumentaГЦo das enumeraГУes"; } /*! header that is put before the list of member functions. */ QCString trMemberFunctionDocumentation() @@ -57,7 +95,16 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 /*! header that is put before the list of member attributes. */ QCString trMemberDataDocumentation() - { return "DocumentaГЦo dos dados"; } + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "DocumentaГЦo dos campos e atributos"; + } + else + { + return "DocumentaГЦo dos dados membro"; + } + } /*! this is the text of a link put after brief descriptions. */ QCString trMore() @@ -101,14 +148,6 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 QCString trDefinedIn() { return "definido em"; } - /*! put as in introduction in the verbatim header file of a class. - * parameter f is the name of the include file. - */ - QCString trIncludeFile() - { return "Ficheiro incluМdo"; } - QCString trVerbatimText(const char *f) - { return (QCString)"Este texto foi originado pelo ficheiro incluМdo "+f+"."; } - // quick reference sections /*! This is put above each page as a link to the list of all groups of @@ -123,27 +162,54 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 /*! This is put above each page as a link to the list of annotated classes */ QCString trCompoundList() - { return "Lista de componentes"; + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Estruturas de dados"; + } + else + { + return "Lista de componentes"; + } + } - /*! This is put above each page as a link to the list of documented files */} + /*! This is put above each page as a link to the list of documented files */ QCString trFileList() { return "Lista de ficheiros"; } /*! This is put above each page as a link to the list of all verbatim headers */ QCString trHeaderFiles() - { return "Ficheiros IncluМdos"; } + { return "Ficheiros incluМdos"; } /*! This is put above each page as a link to all members of compounds. */ QCString trCompoundMembers() - { return "Componentes"; } + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Campos de dados"; + } + else + { + return "Componentes membro"; + } + } /*! This is put above each page as a link to all members of files. */ QCString trFileMembers() - { return "DeclaraГУes"; } + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Globais"; + } + else + { + return "Ficheiros membro"; + } + } /*! This is put above each page as a link to all related pages. */ QCString trRelatedPages() - { return "Paginas relacionadas"; } + { return "PАginas relacionadas"; } /*! This is put above each page as a link to all examples. */ QCString trExamples() @@ -168,28 +234,78 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 /*! This is an introduction to the annotated compound list. */ QCString trCompoundListDescription() - { return "Lista da classes, estruturas, uniУes e interfaces com uma breve descriГЦo:"; + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Lista das estruturas de dados com uma breve descriГЦo:"; + } + else + { + return "Lista de classes, estruturas, uniУes e interfaces com uma breve descriГЦo:"; + } } /*! This is an introduction to the page with all class members. */ QCString trCompoundMembersDescription(bool extractAll) { - QCString result="Lista de todas as funГУes membro "; - if (!extractAll) result+="documentadas "; - result+="com links para "; - if (extractAll) result+="a documentaГЦo da classe correspondente:"; - else result+="o ficheiro a que pertencem:"; + QCString result="Lista de todas as"; + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + result+=" estruturas e campos de uniУes"; + } + else + { + result+=" classes membro"; + } + if (!extractAll) + { + result+=" documentadas"; + } + result+=" com links para "; + if (extractAll) + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + result+="a respectiva documentaГЦo:"; + } + else + { + result+="a documentaГЦo de cada membro:"; + } + } + else + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + result+="as estruturas/uniУes a que pertencem:"; + } + else + { + result+="as classes a que pertencem:"; + } + } return result; } /*! This is an introduction to the page with all file members. */ QCString trFileMembersDescription(bool extractAll) { - QCString result="Lista de todas as funГУes membro "; - if (!extractAll) result+="documentadas "; + QCString result="Lista de todas as "; + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + result+="funГУes, variАveis, definiГУes, enumeraГУes e definiГУes de tipo "; + if (!extractAll) result+="documentadas "; + } + else + { + result+="ficheiros membro"; + if (!extractAll) result+="documentados "; + } result+="com links para "; - if (extractAll) result+="a documentaГЦo correspondente:"; - else result+="os ficheiros onde foram definidas:"; + if (extractAll) + result+="os ficheiro a que pertecem:"; + else + result+="a respectiva documentaГЦo:"; return result; } @@ -238,7 +354,16 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 * annotated compound index. */ QCString trCompoundIndex() - { return "мndice dos componentes"; } + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "мndice das estruturas de dados"; + } + else + { + return "мndice dos componentes"; + } + } /*! This is used in LaTeX as the title of the chapter with the * list of all files. @@ -296,7 +421,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 * list of typedefs */ QCString trTypedefs() - { return "DefiniГЦo de tipos"; } + { return "DefiniГУes de tipos"; } /*! This is used in the documentation of a file as a header before the * list of enumerations @@ -330,25 +455,25 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 * documentation blocks for defines */ QCString trDefineDocumentation() - { return "DocumentaГЦo da macro"; } + { return "DocumentaГЦo das macros"; } /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for function prototypes */ QCString trFunctionPrototypeDocumentation() - { return "DocumentaГЦo do protСtipo da funГЦo"; } + { return "DocumentaГЦo dos protСtipos de funГУes"; } /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for typedefs */ QCString trTypedefDocumentation() - { return "DocumentaГЦo do tipo"; } + { return "DocumentaГЦo dos tipos"; } /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for enumeration types */ QCString trEnumerationTypeDocumentation() - { return "DocumentaГЦo do tipo de enumeraГЦo"; } + { return "DocumentaГЦo dos valores da enumeraГЦo"; } /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for enumeration values @@ -360,19 +485,28 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 * of documentation blocks for functions */ QCString trFunctionDocumentation() - { return "DocumentaГЦo da funГЦo"; } + { return "DocumentaГЦo das funГУes"; } /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for variables */ QCString trVariableDocumentation() - { return "DocumentaГЦo da variАvel"; } + { return "DocumentaГЦo das variАveis"; } /*! This is used in the documentation of a file/namespace/group before * the list of links to documented compounds */ QCString trCompounds() - { return "Componentes"; } + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Estruturas de Dados"; + } + else + { + return "Componentes"; + } + } /*! This is used in the documentation of a group before the list of * links to documented files @@ -409,7 +543,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 /*! this text is generated when the \\reimp command is used. */ QCString trReimplementedForInternalReasons() - { return "Redefinido por razУes internas; o interface nЦo И afectado"; + { return "Redefinido por razУes internas; A interface nЦo foi afectada."; } /*! this text is generated when the \\warning command is used. */ @@ -452,8 +586,11 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 QCString trGeneratedBy() { return "Gerado por"; } - // new since 0.49-990307 +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990307 +////////////////////////////////////////////////////////////////////////// + /*! used as the title of page containing all the index of all namespaces. */ virtual QCString trNamespaceList() { return "Lista de namespaces"; } @@ -480,7 +617,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 * related classes */ virtual QCString trRelatedFunctionDocumentation() - { return "DocumentaГЦo das funГУes relacionadas e classes amigas"; } + { return "DocumentaГЦo das classes amigas e funГУes relacionadas"; } ////////////////////////////////////////////////////////////////////////// // new since 0.49-990425 @@ -491,7 +628,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 ClassDef::CompoundType compType, bool isTemplate) { - QCString result="Referencia "; + QCString result="ReferЙncia "; switch(compType) { case ClassDef::Class: result+="Ю classe "; break; @@ -500,10 +637,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 case ClassDef::Interface: result+="ao interface "; break; case ClassDef::Exception: result+="Ю excepГЦo "; break; } - - if (isTemplate) - result+="<template> "; - + if (isTemplate) result+="Template "; result+=(QCString)clName; return result; } @@ -511,7 +645,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 /*! used as the title of the HTML page of a file */ virtual QCString trFileReference(const char *fileName) { - QCString result= "Referencia ao ficheiro "; + QCString result= "ReferЙncia ao ficheiro "; result += fileName; return result; } @@ -519,7 +653,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 /*! used as the title of the HTML page of a namespace */ virtual QCString trNamespaceReference(const char *namespaceName) { - QCString result= "Referencia ao namespace "; + QCString result= "ReferЙncia ao namespace "; result += namespaceName; return result; } @@ -565,7 +699,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 if (i<numEntries-2) // not the fore last entry result+=", "; else // the fore last entry - result+=", e "; + result+=" e "; } } return result; @@ -611,15 +745,17 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 virtual QCString trNamespaceMemberDescription(bool extractAll) { QCString result="Lista "; - if (extractAll) result+="de todos os "; + if (extractAll) result+="de todos os "; else result+="de toda a documentaГЦo dos "; result+="membros do namespace com links para "; - if (extractAll) result+="a documentaГЦo de cada membro:"; - else result+="o namespace correspondente:"; + if (extractAll) + result+="a documentaГЦo de cada membro:"; + else + result+="o namespace correspondente:"; return result; } - /*! This is used in LaTeX as the title of the chapter with the + /*! This is used in LaTeX as the title of the chapter with the * index of all namespaces. */ virtual QCString trNamespaceIndex() @@ -738,7 +874,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 /*! header that is put before the list of constructor/destructors. */ virtual QCString trConstructorDocumentation() { - return "DocumentaГЦo do Construtor & Destrutor"; + return "DocumentaГЦo dos Construtores & Destrutor"; } /*! Used in the file documentation to point to the corresponding sources. */ virtual QCString trGotoSourceCode() @@ -795,7 +931,7 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 ////////////////////////////////////////////////////////////////////////// // new since 1.1.0 ////////////////////////////////////////////////////////////////////////// - + virtual QCString trNote() { return "Nota"; @@ -806,7 +942,14 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 } virtual QCString trPublicAttribs() { - return "Atributos PЗblicos"; + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Campos de Dados"; + } + else + { + return "Atributos PЗblicos"; + } } virtual QCString trStaticPublicAttribs() { @@ -870,12 +1013,340 @@ class TranslatorPortuguese : public TranslatorAdapter_1_1_5 } virtual QCString trInclByDepGraph() { - return "Este grАfico mostra quais sЦo os ficheiros que incluem directamente ou indirectamente este ficheiro:"; + return "Este grafo mostra quais sЦo os ficheiros que incluem directamente ou indirectamente este ficheiro:"; } virtual QCString trSince() { return "Desde"; } +////////////////////////////////////////////////////////////////////////// +// new since 1.1.5 +////////////////////////////////////////////////////////////////////////// + + /*! title of the graph legend page */ + virtual QCString trLegendTitle() + { + return "Legenda do grafo"; + } + /*! page explaining how the dot graph's should be interpreted */ + virtual QCString trLegendDocs() + { + return + "Esta pАgina explica como interpretar os grafos gerados pelo doxygen.<p>\n" + "Considere o seguinte exemplo:\n" + "\\code\n" + "/*! Esta classe vai estar escondida devido Ю truncaГЦo */\n" + "class Invisible { };\n\n" + "/*! Esta classe tem a relaГЦo de heranГa escondida */\n" + "class Truncated : public Invisible { };\n\n" + "/* Classe nЦo documentada por comentАrios doxygen */\n" + "class Undocumented { };\n\n" + "/*! Classe derivada usando derivaГЦo pЗblica */\n" + "class PublicBase : public Truncated { };\n\n" + "/*! Classe derivada usando derivaГЦo protegida */\n" + "class ProtectedBase { };\n\n" + "/*! Classe derivada usando derivaГЦo privada */\n" + "class PrivateBase { };\n\n" + "/*! Classe usada pela classe Inherited */\n" + "class Used { };\n\n" + "/*! Super classe que deriva de vАrias classes */\n" + "class Inherited : public PublicBase,\n" + " protected ProtectedBase,\n" + " private PrivateBase,\n" + " public Undocumented\n" + "{\n" + " private:\n" + " Used *m_usedClass;\n" + "};\n" + "\\endcode\n" + "Se no ficheiro de configuraГЦo estiver a tag \\c MAX_DOT_GRAPH_HEIGHT " + "com o valor de 200 entЦo o seguinte grafo serА gerado:" + "<p><center><img src=\"graph_legend.gif\"></center>\n" + "<p>\n" + "As caixas no grafo anterior tЙm as seguintes interpretaГУes:\n" + "<ul>\n" + "<li>Uma caixa inteiramente preta representa a estrutura ou a classe para " + "a qual o grafo foi gerado.\n" + "<li>Uma caixa com borda preta representa uma estrutura ou classe documentada.\n" + "<li>Uma caixa com borda cinzenta representa uma estrutura ou classe nЦo documentada.\n" + "<li>Uma caixa com borda vermelha representa uma estrutura ou classe documentada onde " + "nem todas as relaГУes de heranГa/encapsulamento sЦo exibidas. Um grafo И truncado " + "quando nЦo cabe na sua Аrea predefinida.\n" + "</ul>\n" + "As setas tЙm a seguinte interpretaГЦo:\n" + "<ul>\n" + "<li>Uma seta azul escura representa uma relaГЦo de heranГa pЗblica entre duas classes.\n" + "<li>Uma seta verde escura representa uma relaГЦo de heranГa protegida.\n" + "<li>Uma seta vermelha escura representa uma relaГЦo de heranГa privada.\n" + "<li>Uma seta rocha em tracejado representa uma relaГЦo de encapsulamento ou uso por " + "parte de outra classe. A legenda da seta contИm o nome da variАvel ou variАveis da " + "relaГЦo. A seta aponta da classe que estabelece a relaГЦo para a classe ou estrutura que " + "И acessМvel.\n" + "</ul>\n"; + } + /*! text for the link to the legend page */ + virtual QCString trLegend() + { + return "legenda"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.0 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a marker that is put before a test item */ + virtual QCString trTest() + { + return "Teste"; + } + /*! Used as the header of the test list */ + virtual QCString trTestList() + { + return "Lista de teste"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.1 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a section header for KDE-2 IDL methods */ + virtual QCString trDCOPMethods() + { + return "MИtodos DCOP"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.2 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a section header for IDL properties */ + virtual QCString trProperties() + { + return "Propriedades"; + } + /*! Used as a section header for IDL property documentation */ + virtual QCString trPropertyDocumentation() + { + return "DocumentaГЦo das propriedades"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.4 +////////////////////////////////////////////////////////////////////////// + + /*! Used for Java interfaces in the summary section of Java packages */ + virtual QCString trInterfaces() + { + return "Interfaces"; + } + /*! Used for Java classes in the summary section of Java packages */ + virtual QCString trClasses() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return "Estruturas de dados"; + } + else + { + return "Classes"; + } + } + /*! Used as the title of a Java package */ + virtual QCString trPackage(const char *name) + { + return (QCString)"Pacote "+name; + } + /*! Title of the package index page */ + virtual QCString trPackageList() + { + return "Lista de pacotes"; + } + /*! The description of the package index page */ + virtual QCString trPackageListDescription() + { + return "Lista de pacotes com uma breve descriГЦo (se disponМvel):"; + } + /*! The link name in the Quick links header for each page */ + virtual QCString trPackages() + { + return "Pacotes"; + } + /*! Used as a chapter title for Latex & RTF output */ + virtual QCString trPackageDocumentation() + { + return "DocumentaГЦo do pacote"; + } + /*! Text shown before a multi-line define */ + virtual QCString trDefineValue() + { + return "Valor:"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.5 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a marker that is put before a \\bug item */ + virtual QCString trBug() + { + return "Bug"; + } + /*! Used as the header of the bug list */ + virtual QCString trBugList() + { + return "Lista de Bugs"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.6 +////////////////////////////////////////////////////////////////////////// + + /*! Used as ansicpg for RTF file + * + * The following table shows the correlation of Charset name, Charset Value and + * <pre> + * Codepage number: + * Charset Name Charset Value(hex) Codepage number + * ------------------------------------------------------ + * DEFAULT_CHARSET 1 (x01) + * SYMBOL_CHARSET 2 (x02) + * OEM_CHARSET 255 (xFF) + * ANSI_CHARSET 0 (x00) 1252 + * RUSSIAN_CHARSET 204 (xCC) 1251 + * EE_CHARSET 238 (xEE) 1250 + * GREEK_CHARSET 161 (xA1) 1253 + * TURKISH_CHARSET 162 (xA2) 1254 + * BALTIC_CHARSET 186 (xBA) 1257 + * HEBREW_CHARSET 177 (xB1) 1255 + * ARABIC _CHARSET 178 (xB2) 1256 + * SHIFTJIS_CHARSET 128 (x80) 932 + * HANGEUL_CHARSET 129 (x81) 949 + * GB2313_CHARSET 134 (x86) 936 + * CHINESEBIG5_CHARSET 136 (x88) 950 + * </pre> + * + */ + virtual QCString trRTFansicp() + { + return "1252"; + } + + + /*! Used as ansicpg for RTF fcharset + * \see trRTFansicp() for a table of possible values. + */ + virtual QCString trRTFCharSet() + { + return "0"; + } + + /*! Used as header RTF general index */ + virtual QCString trRTFGeneralIndex() + { + return "мndice"; + } + + /*! 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 trClass(bool first_capital, bool singular) + { + QCString result((first_capital ? "Classe" : "classe")); + 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 trFile(bool first_capital, bool singular) + { + QCString result((first_capital ? "Ficheiro" : "ficheiro")); + 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 trNamespace(bool first_capital, bool singular) + { + QCString result((first_capital ? "Namespace" : "namespace")); + 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 trGroup(bool first_capital, bool singular) + { + QCString result((first_capital ? "Grupo" : "grupo")); + 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 trPage(bool first_capital, bool singular) + { + QCString result((first_capital ? "PАgina" : "pАgina")); + 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 trMember(bool first_capital, bool singular) + { + QCString result((first_capital ? "Membro" : "membro")); + 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 trField(bool first_capital, bool singular) + { + QCString result((first_capital ? "Campo" : "campo")); + 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 trGlobal(bool first_capital, bool singular) + { + QCString result((first_capital ? "Globa" : "globa")); + result+= singular? "l" : "ais"; + return result; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.7 +////////////////////////////////////////////////////////////////////////// + + /*! This text is generated when the \\author command is used and + * for the author section in man pages. */ + virtual QCString trAuthor(bool first_capital, bool singular) + { + QCString result((first_capital ? "Autor" : "autor")); + if (!singular) result+="es"; + return result; + } + }; #endif diff --git a/src/translator_ua.h b/src/translator_ua.h new file mode 100644 index 0000000..3275d9c --- /dev/null +++ b/src/translator_ua.h @@ -0,0 +1,1329 @@ +/****************************************************************************** + * + * + * + * Copyright (C) 1997-2000 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. + * + * The translation into Ukrainian was provided by + * Olexij Tkatchenko (olexij.tkatchenko@parcs.de) + */ + +#ifndef TRANSLATOR_UA_H +#define TRANSLATOR_UA_H + +class TranslatorUkrainian : public Translator +{ + private: + /*! The Decode() inline assumes the source written in the + Koi8-U encoding (maintainer dependent). + */ + inline QCString decode(const QCString & sInput) + { +#ifdef _WIN32 + return Koi8RToWindows1251(sInput); +#else + return sInput; +#endif + } + + public: + /*! Used for identification of the language. */ + virtual QCString idLanguage() + { return "ukrainian"; } + + /* Used to get the command(s) for the language support. */ + virtual QCString latexLanguageSupportCommand() +#ifdef _WIN32 + { return "\\usepackage[cp1251]{inputenc}\n\\usepackage[ukrainian]{babel}\n"; } +#else + { return "\\usepackage[koi8-u]{inputenc}\n\\usepackage[ukrainian]{babel}\n"; } +#endif + + /*! return the language charset. This will be used for the HTML output */ + virtual QCString idLanguageCharset() +#ifdef _WIN32 + { return "Windows-1251"; } +#else + { return "koi8-u"; } +#endif + + // --- Language translation methods ------------------- + + /*! used in the compound documentation before a list of related functions. */ + virtual QCString trRelatedFunctions() + { return decode("Спор╕днен╕ фукц╕╖"); } + + /*! subscript for the related functions. */ + virtual QCString trRelatedSubscript() + { return decode("(не методи компонент)"); } + + /*! header that is put before the detailed description of files, classes and namespaces. */ + virtual QCString trDetailedDescription() + { return decode("Детальний опис"); } + + /*! header that is put before the list of typedefs. */ + virtual QCString trMemberTypedefDocumentation() + { return decode("Опис тип╕в користувача"); } + + /*! header that is put before the list of enumerations. */ + virtual QCString trMemberEnumerationDocumentation() + { return decode("Опис перел╕к╕в користувача"); } + + /*! header that is put before the list of member functions. */ + virtual QCString trMemberFunctionDocumentation() + { return decode("Опис метод╕в компонент"); } + + /*! header that is put before the list of member attributes. */ + virtual QCString trMemberDataDocumentation() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return decode( "Поля" ); + } + else + { + return decode( "Компонентн╕ дан╕" ); + } + } + + /*! this is the text of a link put after brief descriptions. */ + virtual QCString trMore() + { return decode("Детальн╕ше..."); } + + /*! put in the class documentation */ + /* Dosn't use when optimization for C is on. */ + virtual QCString trListOfAllMembers() + { + return decode( "Список вс╕х елемент╕в" ); + } + + /*! used as the title of the "list of all members" page of a class */ + /* Dosn't use when optimization for C is on. */ + virtual QCString trMemberList() + { + return decode( "Cписок елемент╕в" ); + } + + /*! this is the first part of a sentence that is followed by a class name */ + /* Dosn't use when optimization for C is on. */ + virtual QCString trThisIsTheListOfAllMembers() + { return decode("Повний список елемент╕в"); } + + /*! this is the remainder of the sentence after the class name */ + /* Dosn't use when optimization for C is on. */ + virtual QCString trIncludingInheritedMembers() + { return decode(", включаючи вс╕ успадкован╕ елементи"); } + + /*! this is put at the author sections at the bottom of man pages. + * parameter s is name of the project name. + */ + virtual QCString trGeneratedAutomatically(const char *s) + { QCString result=decode("Автоматично створено за допомогою Doxygen"); + if (s) result+=decode(" для ")+s; + result+=decode(" з тексту програми."); + return result; + } + + /*! put after an enum name in the list of all members */ + virtual QCString trEnumName() + { return decode("Перел╕к"); } + + /*! put after an enum value in the list of all members */ + virtual QCString trEnumValue() + { return decode("Елемент перел╕ку"); } + + /*! put after an undocumented member in the list of all members */ + virtual QCString trDefinedIn() + { return decode("визначено в "); } + + // quick reference sections + + /*! This is put above each page as a link to the list of all groups of + * compounds or files (see the \\group command). + */ + virtual QCString trModules() + { return decode("Програмн╕ модул╕"); } + + /*! This is put above each page as a link to the class hierarchy */ + virtual QCString trClassHierarchy() + { return decode("╤╓рарх╕я клас╕в"); } + + /*! This is put above each page as a link to the list of annotated classes */ + virtual QCString trCompoundList() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return decode( "Структури даних" ); + } + else + { + return decode( "Класи" ); + } + } + + /*! This is put above each page as a link to the list of documented files */ + virtual QCString trFileList() + { return decode("Файли"); } + + /*! This is put above each page as a link to the list of all verbatim headers */ + virtual QCString trHeaderFiles() + { return decode("Заголовочн╕ файли"); } + + /*! This is put above each page as a link to all members of compounds. */ + virtual QCString trCompoundMembers() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return decode( "Поля структур" ); + } + else + { + return decode( "Елементи клас╕в" ); + } + } + + /*! This is put above each page as a link to all members of files. */ + /*??*/ + virtual QCString trFileMembers() + { + return decode( "Елементи файлу" ); + } + + /*! This is put above each page as a link to all related pages. */ + virtual QCString trRelatedPages() + /* ?? Вариант перевода "См. также: " более удачный, но не в заголовке, + как в данном случае. */ + { return decode("Додаткова ╕нформац╕я"); } + + /*! This is put above each page as a link to all examples. */ + virtual QCString trExamples() + { return decode("Приклади"); } + + /*! This is put above each page as a link to the search engine. */ + virtual QCString trSearch() + { return decode("Пошук"); } + + /*! This is an introduction to the class hierarchy. */ + virtual QCString trClassHierarchyDescription() + { return decode("Список успадкувань впорядковано наближено до алфав╕ту"); } + + /*! This is an introduction to the list with all files. */ + virtual QCString trFileListDescription(bool extractAll) + { + QCString result="Повний список "; + if (!extractAll) result+="документованих "; + result+="файл╕в."; + return decode(result); + } + + /*! This is an introduction to the annotated compound list. */ + virtual QCString trCompoundListDescription() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return decode( "Структури даних з коротким описом." ); + } + else + { + return decode( "Класи, структури, об'╓днання та ╕нтерфейси з коротким описом." ); + } + } + + /*! This is an introduction to the page with all class members. */ + virtual QCString trCompoundMembersDescription(bool extractAll) + { + QCString result="Список вс╕х "; + if(!extractAll) result+="документоаних "; + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + result+="елемент╕в структур даних з посиланням на "; + else + result+="елемент╕в клас╕в даних з посиланням на "; + if(extractAll) + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + result+="документац╕ю по структур╕/об'╓днанню кожного елементу."; + else + result+="документац╕ю по класу кожного елементу."; + } + else + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + result += "в╕дпов╕дн╕ структури"; + else + result += "в╕дпов╕дн╕ класи"; + result+=", до яких вони належать."; + } + return decode( result ); + } + + /*! This is an introduction to the page with all file members. */ + virtual QCString trFileMembersDescription(bool extractAll) + { + QCString result="Список вс╕х "; + if (!extractAll) result+="документованих "; + + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + result+="функц╕й, зм╕нних, макроозначень, " + "перел╕к╕в ╕ означень тип╕в"; + } + else + { + result+="елемент╕в файл╕в "; + } + result+=" з посиланям на "; + if (extractAll) + result+="файли, до яких вони належать."; + else + result+="документац╕ю."; + return decode( result ); + } + + /*! This is an introduction to the page with the list of all header files. */ + virtual QCString trHeaderFilesDescription() + { return decode("Повний список заголовочних файл╕в."); } + + /*! This is an introduction to the page with the list of all examples */ + virtual QCString trExamplesDescription() + { return decode("Повний список приклад╕в."); } + + /*! This is an introduction to the page with the list of related pages */ + virtual QCString trRelatedPagesDescription() + { return decode("Полный список додаткових опис╕в."); } + + /*! This is an introduction to the page with the list of class/file groups */ + virtual QCString trModulesDescription() + { return decode("Полный список модул╕в."); } + + /*! This sentences is used in the annotated class/file lists if no brief + * description is given. + */ + virtual QCString trNoDescriptionAvailable() + { return decode("Опис в╕дсутн╕й"); } + + // index titles (the project name is prepended for these) + + + /*! This is used in HTML as the title of index.html. */ + virtual QCString trDocumentation() + { return decode("Документац╕я"); } + + /*! This is used in LaTeX as the title of the chapter with the + * index of all groups. + */ + virtual QCString trModuleIndex() + { return decode("Алфав╕тний покажчик модул╕в"); } + + /*! This is used in LaTeX as the title of the chapter with the + * class hierarchy. + */ + virtual QCString trHierarchicalIndex() + { return decode("╤╓рарх╕чний покажчик клас╕в"); } + + /*! This is used in LaTeX as the title of the chapter with the + * annotated compound index. + */ + virtual QCString trCompoundIndex() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return decode( "Алфав╕тний покажчик структур даних" ); + } + else + { + return decode( "Алфав╕тний покажчик клас╕в" ); + } + } + + /*! This is used in LaTeX as the title of the chapter with the + * list of all files. + */ + virtual QCString trFileIndex() + { return decode( "Покажчик файлв" ); } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all groups. + */ + virtual QCString trModuleDocumentation() + { return decode("Програмн╕ Модул╕"); } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all classes, structs and unions. + */ + virtual QCString trClassDocumentation() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return decode( "Структури даних" ); + } + else + { + return decode( "Класи" ); + } + } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all files. + */ + virtual QCString trFileDocumentation() + { return decode("Файли"); } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all examples. + */ + virtual QCString trExampleDocumentation() + { return decode("Приклади"); } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all related pages. + */ + virtual QCString trPageDocumentation() + { return decode("Документац╕я по тем╕"); } + + /*! This is used in LaTeX as the title of the document */ + virtual QCString trReferenceManual() + { return decode("Дов╕дковий пос╕бник"); } + + /*! This is used in the documentation of a file as a header before the + * list of defines + */ + virtual QCString trDefines() + { return decode("Макроозначення"); } + + /*! This is used in the documentation of a file as a header before the + * list of function prototypes + */ + virtual QCString trFuncProtos() + { return decode("Прототипи фукц╕й"); } + + /*! This is used in the documentation of a file as a header before the + * list of typedefs + */ + virtual QCString trTypedefs() + { return decode("Означення тип╕в"); } + + /*! This is used in the documentation of a file as a header before the + * list of enumerations + */ + virtual QCString trEnumerations() + { return decode("Перел╕ки"); } + + /*! This is used in the documentation of a file as a header before the + * list of (global) functions + */ + virtual QCString trFunctions() + { return decode("Функц╕╖"); } + + /*! This is used in the documentation of a file as a header before the + * list of (global) variables + */ + virtual QCString trVariables() + { return decode("Зм╕нн╕"); } + + /*! This is used in the documentation of a file as a header before the + * list of (global) variables + */ + virtual QCString trEnumerationValues() + { return decode("Елементи перел╕к╕в"); } + + /*! This is used in the documentation of a file before the list of + * documentation blocks for defines + */ + virtual QCString trDefineDocumentation() + { return decode("Опис макроозначень"); } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for function prototypes + */ + virtual QCString trFunctionPrototypeDocumentation() + { return decode("Опис прототип╕в функц╕й"); } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for typedefs + */ + virtual QCString trTypedefDocumentation() + { return decode("Опис означень тип╕в"); } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for enumeration types + */ + virtual QCString trEnumerationTypeDocumentation() + { return decode("Опис перел╕к╕в"); } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for enumeration values + */ + virtual QCString trEnumerationValueDocumentation() + { return decode("Опис елемент╕в перел╕ку"); } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for functions + */ + virtual QCString trFunctionDocumentation() + { return decode("Опис функц╕й"); } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for variables + */ + virtual QCString trVariableDocumentation() + { return decode("Опис зм╕нних"); } + + /*! This is used in the documentation of a file/namespace/group before + * the list of links to documented compounds + */ + virtual QCString trCompounds() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return decode( "Структури даних" ); + } + else + { + return decode( "Класи" ); + } + + } + + /*! This is used in the documentation of a group before the list of + * links to documented files + */ + /*! This is used in the standard footer of each page and indicates when + * the page was generated + */ + virtual QCString trGeneratedAt(const char *date,const char *projName) + { + QCString result=decode("Документац╕я "); + if (projName) result+=decode("до ")+projName; + result+=decode(" створена ")+date; + result+=decode(" системою"); + return result; + } + /*! This is part of the sentence used in the standard footer of each page. + */ + virtual QCString trWrittenBy() + { + return decode("Автор:"); + } + + /*! this text is put before a class diagram */ + virtual QCString trClassDiagram(const char *clName) + { + return decode("Схема успадкувань для ")+clName; + } + + /*! this text is generated when the \\internal command is used. */ + virtual QCString trForInternalUseOnly() + { return decode("Т╕льки для внутр╕шнього користування"); } + + /*! this text is generated when the \\reimp command is used. */ + virtual QCString trReimplementedForInternalReasons() + /*??*/ + { return decode("Зм╕нено з внутр╕шн╕х причин. Зм╕ни не торкаються API."); + } + + /*! this text is generated when the \\warning command is used. */ + virtual QCString trWarning() + { return decode("Застереження"); } + + /*! this text is generated when the \\bug command is used. */ + virtual QCString trBugsAndLimitations() + { return decode("Помилки та обмеження застосування"); } + + /*! this text is generated when the \\version command is used. */ + virtual QCString trVersion() + { return decode("Верс╕я"); } + + /*! this text is generated when the \\date command is used. */ + virtual QCString trDate() + { return decode("Дата"); } + + /*! this text is generated when the \\return command is used. */ + virtual QCString trReturns() + { return decode("Поверта╓"); } + + /*! this text is generated when the \\sa command is used. */ + virtual QCString trSeeAlso() + { return decode("Див. також"); } + + /*! this text is generated when the \\param command is used. */ + virtual QCString trParameters() + { return decode("Аргументи"); } + + /*! this text is generated when the \\exception command is used. */ + virtual QCString trExceptions() + { return decode("Обробка виняткових ситуац╕й"); } + + /*! this text is used in the title page of a LaTeX document. */ + virtual QCString trGeneratedBy() + { return decode("Створено системою"); } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990307 +////////////////////////////////////////////////////////////////////////// + + /*! used as the title of page containing all the index of all namespaces. */ + virtual QCString trNamespaceList() + { return decode("Прост╕р ╕мен"); } + + /*! used as an introduction to the namespace list */ + virtual QCString trNamespaceListDescription(bool extractAll) + { + QCString result="Повний перел╕к "; + if (!extractAll) result+="документованих "; + result+="простор╕в ╕мен."; + return decode(result); + } + + /*! used in the class documentation as a header before the list of all + * friends of a class + */ + virtual QCString trFriends() + { return decode("Дружн╕ класи"); } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990405 +////////////////////////////////////////////////////////////////////////// + + /*! used in the class documentation as a header before the list of all + * related classes + */ + virtual QCString trRelatedFunctionDocumentation() + { return decode("Документация до дружн╕х клас╕в та в╕дпов╕дних функц╕й"); } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990425 +////////////////////////////////////////////////////////////////////////// + + /*! used as the title of the HTML page of a class/struct/union */ + virtual QCString trCompoundReference(const char *clName, + ClassDef::CompoundType compType, + bool isTemplate) + { + QCString result; + if (isTemplate) + { + result="Шаблон "; + switch(compType) + { + case ClassDef::Class: result+="класу"; break; + case ClassDef::Struct: result+="структури"; break; + case ClassDef::Union: result+="об'╓днання"; break; + case ClassDef::Interface: result+="╕нтерфейсу"; break; + case ClassDef::Exception: result+="Виняток"; break; + } + } + else + { + switch(compType) + { + case ClassDef::Class: result+="Клас"; break; + case ClassDef::Struct: result+="Структура"; break; + case ClassDef::Union: result+="Об'╓днання"; break; + case ClassDef::Interface: result+="╤нтерфейс"; break; + case ClassDef::Exception: result+="Виняток"; break; + } + } + result+=" "; + return decode(result)+clName; + } + + /*! used as the title of the HTML page of a file */ + virtual QCString trFileReference(const char *fileName) + { + return decode("Файл ")+fileName; + } + + /*! used as the title of the HTML page of a namespace */ + virtual QCString trNamespaceReference(const char *namespaceName) + { + return decode("Прост╕р ╕мен ")+namespaceName; + } + + virtual QCString trPublicMembers() + { return decode("Загальнодоступн╕ елементи"); } + virtual QCString trPublicSlots() + { return decode("Загальнодоступн╕ слоти"); } + virtual QCString trSignals() + { return decode("Сигнали"); } + virtual QCString trStaticPublicMembers() + { return decode("Загальнодоступн╕ статичн╕ елементи"); } + virtual QCString trProtectedMembers() + { return decode("Захищен╕ елементи"); } + virtual QCString trProtectedSlots() + { return decode("Захищен╕ слоти"); } + virtual QCString trStaticProtectedMembers() + { return decode("Захищен╕ статичн╕ елементи"); } + virtual QCString trPrivateMembers() + { return decode("Приватн╕ елементи"); } + virtual QCString trPrivateSlots() + { return decode("Приватн╕ слоти"); } + virtual QCString trStaticPrivateMembers() + { return decode("Приватн╕ статичн╕ елементи"); } + + /*! this function is used to produce a comma-separated list of items. + * use generateMarker(i) to indicate where item i should be put. + */ + virtual QCString trWriteList(int numEntries) + { + QCString result; + int i; + // the inherits list contain `numEntries' classes + for (i=0;i<numEntries;i++) + { + // use generateMarker to generate placeholders for the class links! + result+=generateMarker(i); // generate marker for entry i in the list + // (order is left to right) + + if (i!=numEntries-1) // not the last entry, so we need a separator + { + if (i<numEntries-2) // not the fore last entry + result+=", "; + else // the fore last entry + result+=decode( " ╕ " ); + } + } + return result; + } + + /*! used in class documentation to produce a list of base classes, + * if class diagrams are disabled. + */ + virtual QCString trInheritsList(int numEntries) + { + return decode("Успадкову╓ клас ")+trWriteList(numEntries)+"."; + } + + /*! used in class documentation to produce a list of super classes, + * if class diagrams are disabled. + */ + virtual QCString trInheritedByList(int numEntries) + { + return decode("Успадковано класами ")+trWriteList(numEntries)+"."; + } + + /*! used in member documentation blocks to produce a list of + * members that are hidden by this one. + */ + virtual QCString trReimplementedFromList(int numEntries) + { + return decode("Переозначення з ")+trWriteList(numEntries)+"."; + } + + /*! used in member documentation blocks to produce a list of + * all member that overwrite the implementation of this member. + */ + virtual QCString trReimplementedInList(int numEntries) + { + return decode("Переознача╓ться в ")+trWriteList(numEntries)+"."; + } + + /*! This is put above each page as a link to all members of namespaces. */ + virtual QCString trNamespaceMembers() + { return decode("Елементи простору ╕мен"); } + + /*! This is an introduction to the page with all namespace members */ + virtual QCString trNamespaceMemberDescription(bool extractAll) + { + QCString result="Повний перел╕к "; + if (!extractAll) result+="документованих "; + result+="елемет╕в простору ╕мен з посиланням "; + if (extractAll) + result+="на документац╕ю для кожного елементу:"; + else + result+="на прост╕р ╕мен до якого вони належать:"; + return decode(result); + } + + /*! This is used in LaTeX as the title of the chapter with the + * index of all namespaces. + */ + virtual QCString trNamespaceIndex() + { return decode("Алфав╕тний покажчик простору ╕мен"); } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all namespaces. + */ + virtual QCString trNamespaceDocumentation() + { return decode("Опис простору ╕мен"); } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990522 +////////////////////////////////////////////////////////////////////////// + + /*! This is used in the documentation before the list of all + * namespaces in a file. + */ + virtual QCString trNamespaces() + { return decode( "Простори ╕мен" ); } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990728 +////////////////////////////////////////////////////////////////////////// + + /*! This is put at the bottom of a class documentation page and is + * followed by a list of files that were used to generate the page. + */ + virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType, + bool single) + { // here s is one of " Class", " Struct" or " Union" + // single is true implies a single file + QCString result=(QCString)"Документац╕я "; + switch(compType) + { + case ClassDef::Class: + if (single) result+="цього класу"; else result+="цих клас╕в"; + break; + case ClassDef::Struct: + if (single) result+="ц╕╓╖ структури"; else result+="цих структур"; + break; + case ClassDef::Union: + if (single) result+="цього об'╓днання"; else result+="цих об'╓днань"; + break; + case ClassDef::Interface: + if (single) result+="цього ╕нтерфейсу"; else result+="цих ╕нтерфейс╕в"; + break; + case ClassDef::Exception: + if (single) result+="цього винятку"; else result+="цих винятк╕в"; + break; + } + result+=" була створена з файл"; + if (single) result+="у:"; else result+="╕в:"; + return decode(result); + } + + /*! This is in the (quick) index as a link to the alphabetical compound + * list. + */ + virtual QCString trAlphabeticalList() + { return decode("Алфав╕тний покажчик"); } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990901 +////////////////////////////////////////////////////////////////////////// + + /*! This is used as the heading text for the retval command. */ + virtual QCString trReturnValues() + { return decode("Значения, що повертаються"); } + + /*! This is in the (quick) index as a link to the main page (index.html) + */ + virtual QCString trMainPage() + { return decode("Титульна стор╕нка"); } + + /*! 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 decode("стор."); } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-991106 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trSources() + { + return decode("Вих╕дн╕ тексти."); + } + virtual QCString trDefinedAtLineInSourceFile() + { + return decode("Див. означення в файл╕ @1, рядок @0"); + } + virtual QCString trDefinedInSourceFile() + { + return decode("Див. означення в файл╕ @0"); + } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-991205 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trDeprecated() + { + return decode("Не рекомендовано"); + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.0.0 +////////////////////////////////////////////////////////////////////////// + + /*! this text is put before a collaboration diagram */ + virtual QCString trCollaborationDiagram(const char *clName) + { + return (QCString)decode("Д╕аграма зв'язк╕в класу ")+clName+":"; + } + /*! this text is put before an include dependency graph */ + virtual QCString trInclDepGraph(const char *fName) + { + return decode("Д╕аграма включених заголовочних файл╕в для ")+fName+":"; + } + /*! header that is put before the list of constructor/destructors. */ + virtual QCString trConstructorDocumentation() + { + return decode("Конструктор(и)"); + } + /*! Used in the file documentation to point to the corresponding sources. */ + virtual QCString trGotoSourceCode() + { + return decode("Див. вих╕дн╕ тексти."); + } + /*! Used in the file sources to point to the corresponding documentation. */ + virtual QCString trGotoDocumentation() + { + return decode("Див. документац╕ю."); + } + /*! Text for the \\pre command */ + virtual QCString trPrecondition() + { + return decode("Передумови"); + } + /*! Text for the \\post command */ + virtual QCString trPostcondition() + { + return decode("П╕сляумови"); + } + /*! Text for the \\invariant command */ + virtual QCString trInvariant() + { + return decode("╤нвар╕ант"); + } + /*! Text shown before a multi-line variable/enum initialization */ + virtual QCString trInitialValue() + { + return decode("Початков╕ значення"); + } + /*! Text used the source code in the file index */ + virtual QCString trCode() + { + return decode("Вих╕дн╕ тексти"); + } + virtual QCString trGraphicalHierarchy() + { + return decode("Граф╕чна ╕╓рарх╕я клас╕в"); + } + virtual QCString trGotoGraphicalHierarchy() + { + return decode("див. граф╕чну ╕╓рарх╕ю"); + } + virtual QCString trGotoTextualHierarchy() + { + return decode("див. текстову ╕╓рарх╕ю"); + } + virtual QCString trPageIndex() + { + return decode("Алфав╕тний покажчик тематичних опис╕в"); + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.0 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trNote() + { + return decode("Нотатки"); + } + virtual QCString trPublicTypes() + { + return decode("Загальнодоступн╕ типи"); + } + virtual QCString trPublicAttribs() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return decode( "Поля даних" ); + } + else + { + return decode( "Загальнодоступн╕ атрибути" ); + } + } + virtual QCString trStaticPublicAttribs() + { + return decode("Статичн╕ загальнодоступн╕ данн╕"); + } + virtual QCString trProtectedTypes() + { + return decode("Захищен╕ типи"); + } + virtual QCString trProtectedAttribs() + { + return decode("Захищен╕ дан╕"); + } + virtual QCString trStaticProtectedAttribs() + { + return decode("Статичн╕ захищен╕ дан╕"); + } + virtual QCString trPrivateTypes() + { + return decode("Приватн╕ типи"); + } + virtual QCString trPrivateAttribs() + { + return decode("Приватн╕ дан╕"); + } + virtual QCString trStaticPrivateAttribs() + { + return decode("Приватн╕ статичн╕ дан╕"); + } + + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.3 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a marker that is put before a todo item */ + virtual QCString trTodo() + /*??*/ + { + return decode("Необх╕дно зробити"); + } + /*! Used as the header of the todo list */ + virtual QCString trTodoList() + /*??*/ + { + return decode("Перел╕к завдань"); + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.4 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trReferencedBy() + { + return decode("Вжива╓ться в"); + } + virtual QCString trRemarks() + { + return decode("Прим."); + } + virtual QCString trAttention() + { + return decode("Увага"); + } + virtual QCString trInclByDepGraph() + { + return decode("Граф файлов, як╕ включають цей файл:"); + } + virtual QCString trSince() + /*??*/ + { + return decode("Починаючи з"); + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.5 +////////////////////////////////////////////////////////////////////////// + + /*! title of the graph legend page */ + virtual QCString trLegendTitle() + { + return decode("Легенда"); + } + /*! page explaining how the dot graph's should be interpreted */ + virtual QCString trLegendDocs() + { + return decode( + "Позначення, що використовуються у графах.<p>\n" + "Розглянемо наступний приклад:\n" + "\\code\n" + "/*! Невидимый класс из-за усечения */\n" + "class Invisible { };\n\n" + "/*! Обмежений клас, в╕дношення успадкування приховане */\n" + "class Truncated : public Invisible { };\n\n" + "/* Недокументований класс */\n" + "class Undocumented { };\n\n" + "/*! Загальнодоступне успадкування */\n" + "class PublicBase : public Truncated { };\n\n" + "/*! Захищене успадкування */\n" + "class ProtectedBase { };\n\n" + "/*! Приватне успадкування */\n" + "class PrivateBase { };\n\n" + "/*! Клас, що використову╓ться класом Inherited */\n" + "class Used { };\n\n" + "/*! Клас, що успадкову╓ ╕нш╕ класи */\n" + "class Inherited : public PublicBase,\n" + " protected ProtectedBase,\n" + " private PrivateBase,\n" + " public Undocumented\n" + "{\n" + " private:\n" + " Used *m_usedClass;\n" + "};\n" + "\\endcode\n" + "Якщо \\c MAX_DOT_GRAPH_HEIGHT в конф╕гурац╕йному файл╕ " + "установлене на 200, отрима╓мо наступний граф:" + "<p><center><img src=\"graph_legend.gif\"></center>\n" + "<p>\n" + "Прямокутники в цьому граф╕ мають наступний зм╕ст:\n" + "<ul>\n" + "<li>Заповнений чорний прямокутник в╕добража╓ структуру або клас, " + "для якого створено граф.\n" + "<li>Прямокутник з чорною межею в╕добража╓ документовану структуру або клас.\n" + "<li>Прямокутник з с╕рою межею в╕добража╓ недокументовану структуру або клас.\n" + "<li>Прямокутник з червоною межею в╕добража╓ документовану структуру або клас, для яких\n" + " не вс╕ сп╕вв╕дношення успадкування/зм╕сту показан╕. Граф зр╕заниЙ, " + "якщо в╕н не вм╕ща╓ться у вказан╕ меж╕." + "</ul>\n" + "Стр╕лки мають наступний зм╕ст:\n" + "<ul>\n" + "<li>Темносиня стр╕лка в╕добража╓ в╕дношення загальнодоступного успадкування " + "м╕ь двома класами.\n" + "<li>Темнозелена стр╕лка використову╓ться при захищеному успадкуванн╕.\n" + "<li>Темночервона стр╕лка використову╓ться при приватному успадкуванн╕.\n" + "<li>Пурпурна стр╕лка використову╓ться, якщо клас м╕ститься в" + "╕ншому клас╕ або ним використову╓ться." + "Стр╕лка етикету╓ться зм╕нною, " + "через яку в╕дбува╓ться доступ до вказано╖ структури або класу. \n" + "</ul>\n"); + } + /*! text for the link to the legend page */ + virtual QCString trLegend() + { + return decode("див. легенду"); + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.0 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a marker that is put before a test item */ + virtual QCString trTest() + { + return decode("Тест"); + } + /*! Used as the header of the test list */ + virtual QCString trTestList() + { + return decode("Перел╕к тест╕в"); + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.1 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a section header for KDE-2 IDL methods */ + virtual QCString trDCOPMethods() + { + return decode("DCOP Методи"); + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.2 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a section header for IDL properties */ + virtual QCString trProperties() + { + return decode("Властивост╕"); + } + /*! Used as a section header for IDL property documentation */ + virtual QCString trPropertyDocumentation() + { + return decode("Повний перел╕к властивостей"); + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.4 +////////////////////////////////////////////////////////////////////////// + + /*! Used for Java interfaces in the summary section of Java packages */ + virtual QCString trInterfaces() + { + return decode("╤нтерфейси"); + } + /*! Used for Java classes in the summary section of Java packages */ + virtual QCString trClasses() + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + return decode( "Структури даних" ); + } + else + { + return decode( "Класи" ); + } + } + /*! Used as the title of a Java package */ + virtual QCString trPackage(const char *name) + { + return decode("Пакет ")+name; + } + /*! Title of the package index page */ + virtual QCString trPackageList() + { + return decode("Повний перел╕к пакет╕в"); + } + /*! The description of the package index page */ + virtual QCString trPackageListDescription() + { + return decode("Повний перел╕к документованих пакет╕в."); + } + /*! The link name in the Quick links header for each page */ + virtual QCString trPackages() + { + return decode("Пакети"); + } + /*! Used as a chapter title for Latex & RTF output */ + virtual QCString trPackageDocumentation() + { + return decode("Опис пакет╕в"); + } + /*! Text shown before a multi-line define */ + virtual QCString trDefineValue() + { + return decode("Макроозначення:"); + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.5 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a marker that is put before a \\bug item */ + virtual QCString trBug() + { + return decode("Дефект"); + } + /*! Used as the header of the bug list */ + virtual QCString trBugList() + { + return decode("Перел╕к дефект╕в"); + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.6 +////////////////////////////////////////////////////////////////////////// + /*! Used as ansicpg for RTF file */ + virtual QCString trRTFansicp() + { + return "1251"; + } + /*! Used as ansicpg for RTF fcharset */ + virtual QCString trRTFCharSet() + { + return "204"; + } + /*! Used as header RTF general index */ + virtual QCString trRTFGeneralIndex() + { + return decode("Предметний покажчик"); + } + + /*! 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 trClass(bool first_capital, bool singular) + { + if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) + { + QCString result((first_capital ? "Структури даних" : "структури даних")); + return decode(result); + } + else + { + QCString result((first_capital ? "Клас" : "клас")); + if(!singular) result+="и"; + return decode(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 trFile(bool first_capital, bool singular) + { + QCString result((first_capital ? "Файл" : "файл")); + if (!singular) result+="и"; + return decode(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 trNamespace(bool first_capital, bool singular) + { + QCString result((first_capital ? "Прост" : "прост")); + result+=(singular?"╕р ╕мен":"ори ╕мен"); + return decode(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 trGroup(bool first_capital, bool singular) + { + QCString result((first_capital ? "Груп" : "груп")); + result+=(singular ? "а" : "и"); + return decode(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 trPage(bool first_capital, bool singular) + { + QCString result((first_capital ? "Стор╕нк" : "стор╕нк")); + result+=(singular ? "а" : "и"); + return decode(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 trMember(bool first_capital, bool singular) + { + QCString result((first_capital ? "Елемент" : "елемент")); + if (!singular) result+="и"; + return decode(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 trField(bool first_capital, bool singular) + { + QCString result((first_capital ? "Пол" : "пол")); + result+=(singular ? "е" : "я"); + return decode(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 trGlobal(bool first_capital, bool singular) + { + QCString result((first_capital ? "Глобальн" : "глобальн")); + result+=(singular ? "ий" : "╕"); + return decode(result); + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.2.7 +////////////////////////////////////////////////////////////////////////// + + /*! This text is generated when the \\author command is used and + * for the author section in man pages. */ + virtual QCString trAuthor(bool first_capital, bool singular) + { + QCString result((first_capital ? "Автор" : "автор")); + if (!singular) result+="и"; + return decode(result); + } +}; + +#endif diff --git a/src/util.cpp b/src/util.cpp index 6a022af..52045cb 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1248,6 +1248,11 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, { if (!isspace(dstAType.at(dstPos))) // maybe the names differ { + if (!dstA->name.isEmpty()) // dst has its name separated from its type + { + NOMATCH + return FALSE; + } while (dstPos<dstAType.length() && isId(dstAType.at(dstPos))) dstPos++; if (dstPos!=dstAType.length()) { @@ -1270,6 +1275,11 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, { if (!isspace(srcAType.at(srcPos))) // maybe the names differ { + if (!srcA->name.isEmpty()) // src has its name separated from its type + { + NOMATCH + return FALSE; + } while (srcPos<srcAType.length() && isId(srcAType.at(srcPos))) srcPos++; if (srcPos!=srcAType.length()) { @@ -2860,7 +2870,7 @@ QCString substituteTemplateArgumentsInString( { if (formalArgs==0) return name; QCString result; - static QRegExp re("[a-z_A-Z][:a-z_A-Z0-9]*"); + static QRegExp re("[a-z_A-Z][a-z_A-Z0-9]*"); int p=0,l,i; // for each identifier in the base class name (e.g. B<T> -> B and T) while ((i=re.match(name,p,&l))!=-1) @@ -2901,4 +2911,90 @@ QCString substituteTemplateArgumentsInString( } +/*! Makes a deep copy of argument list \a src. Will allocate memory, that + * is owned by the caller. + */ +ArgumentList *copyArgumentList(const ArgumentList *src) +{ + ASSERT(src!=0); + ArgumentList *dst = new ArgumentList; + dst->setAutoDelete(TRUE); + ArgumentListIterator tali(*src); + Argument *a; + for (;(a=tali.current());++tali) + { + dst->append(new Argument(*a)); + } + dst->constSpecifier = src->constSpecifier; + dst->volatileSpecifier = src->volatileSpecifier; + dst->pureSpecifier = src->pureSpecifier; + return dst; +} + +/*! Makes a deep copy of the list of argument lists \a srcLists. + * Will allocate memory, that is owned by the caller. + */ +QList<ArgumentList> *copyArgumentLists(const QList<ArgumentList> *srcLists) +{ + ASSERT(srcLists!=0); + QList<ArgumentList> *dstLists = new QList<ArgumentList>; + dstLists->setAutoDelete(TRUE); + QListIterator<ArgumentList> sli(*srcLists); + ArgumentList *sl; + for (;(sl=sli.current());++sli) + { + dstLists->append(copyArgumentList(sl)); + } + return dstLists; +} + +/*! Strips template specifiers from scope \a fullName, except those + * that make up specialized classes. The switch \a parentOnly + * determines whether or not a template "at the end" of a scope + * should be considered, e.g. with \a parentOnly is \c TRUE, A<T>::B<S> will + * try to strip <T> and not <S>, while \a parentOnly is \c FALSE will + * strip both unless A<T> or B<S> are specialized template classes. + */ +QCString stripTemplateSpecifiersFromScope(const QCString &fullName, + bool parentOnly) +{ + QCString result; + int p=0; + int l=fullName.length(); + int i=fullName.find('<'); + int si= i==-1 ? -1 : fullName.find("::",i); + while (i!=-1 && (!parentOnly || i<si)) + { + result+=fullName.mid(p,i-p); + //printf("1:result+=%s\n",fullName.mid(p,i-p).data()); + int e=i+1; + bool done=FALSE; + int count=1; + while (e<l && !done) + { + char c=fullName.at(e++); + if (c=='<') + { + count++; + } + else if (c=='>') + { + count--; + done = count==0; + } + } + //printf(" trying %s\n",(result+fullName.mid(i,e-i)).data()); + if (getClass(result+fullName.mid(i,e-i))!=0) + { + result+=fullName.mid(i,e-i); + //printf("2:result+=%s\n",fullName.mid(i,e-i-1).data()); + } + p=e; + i=fullName.find('<',p); + si= i==-1 ? -1 : fullName.find("::",i); + } + result+=fullName.right(l-p); + //printf("3:result+=%s\n",fullName.right(l-p).data()); + return result; +} @@ -153,5 +153,10 @@ bool extractClassNameFromType(const QCString &type,int &pos, QCString substituteTemplateArgumentsInString( const QCString &name,ArgumentList *formalArgs,ArgumentList *actualArgs); +ArgumentList *copyArgumentList(const ArgumentList *src); +QList<ArgumentList> *copyArgumentLists(const QList<ArgumentList> *srcLists); +QCString stripTemplateSpecifiersFromScope(const QCString &fullName, + bool parentOnly=TRUE); + #endif diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp new file mode 100644 index 0000000..4bb20e0 --- /dev/null +++ b/src/xmlgen.cpp @@ -0,0 +1,500 @@ +/****************************************************************************** + * + * + * + * + * Copyright (C) 1997-2001 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 <stdlib.h> + +#include "qtbc.h" +#include "xmlgen.h" +#include "doxygen.h" +#include "message.h" +#include "config.h" +#include "classlist.h" +#include "util.h" +#include "defargs.h" + +#include <qdir.h> +#include <qfile.h> +#include <qtextstream.h> + +static void writeXMLString(QTextStream &t,const char *s) +{ + t << convertToXML(s); +} + +static void writeXMLLink(QTextStream &t,const char *compoundId,const char *memId, + const char *text) +{ + if (memId==0) + { + t << "<compoundref idref=\"" << compoundId << "\">"; + writeXMLString(t,text); + t << "</compoundref>"; + } + else + { + t << "<memberref idref=\"" << compoundId << "_1" << memId << "\">"; + writeXMLString(t,text); + t << "</memberref>"; + } +} + +class TextGeneratorXMLImpl : public TextGeneratorIntf +{ + public: + TextGeneratorXMLImpl(QTextStream &t): m_t(t) {} + void writeString(const char *s) const + { + writeXMLString(m_t,s); + } + void writeBreak() const {} + void writeLink(const char *extRef,const char *file, + const char *anchor,const char *text + ) const + { + if (extRef==0) + { writeXMLLink(m_t,file,anchor,text); } + else // external references are not supported for XML + { writeXMLString(m_t,text); } + } + private: + QTextStream &m_t; +}; + + +void generateXMLForMember(MemberDef *md,QTextStream &t,Definition *def) +{ + if (md->memberType()==MemberDef::EnumValue) return; + + QCString scopeName; + if (md->getClassDef()) + scopeName=md->getClassDef()->name(); + else if (md->getNamespaceDef()) + scopeName=md->getNamespaceDef()->name(); + + t << " <memberdef kind=\""; + //enum { define_t,variable_t,typedef_t,enum_t,function_t } xmlType = function_t; + QCString memType; + bool isFunc=FALSE; + switch (md->memberType()) + { + case MemberDef::Define: memType="define"; break; + case MemberDef::EnumValue: ASSERT(0); break; + case MemberDef::Property: memType="property"; break; + case MemberDef::Variable: memType="variable"; break; + case MemberDef::Typedef: memType="typedef"; break; + case MemberDef::Enumeration: memType="enum"; break; + case MemberDef::Function: memType="function"; isFunc=TRUE; break; + case MemberDef::Signal: memType="signal"; isFunc=TRUE; break; + case MemberDef::Prototype: memType="prototype"; isFunc=TRUE; break; + case MemberDef::Friend: memType="friend"; isFunc=TRUE; break; + case MemberDef::DCOP: memType="dcop"; isFunc=TRUE; break; + case MemberDef::Slot: memType="slot"; isFunc=TRUE; break; + } + t << memType << "\" id=\""; + t << def->getOutputFileBase() + << "_1" // encoded `:' character (see util.cpp:convertNameToFile) + << md->anchor(); + t << "\""; + t << " virt=\""; + switch (md->virtualness()) + { + case Normal: t << "normal"; break; + case Virtual: t << "virtual"; break; + case Pure: t << "pure-virtual"; break; + default: ASSERT(0); + } + t << "\" prot=\""; + switch(md->protection()) + { + case Public: t << "public"; break; + case Protected: t << "protected"; break; + case Private: t << "private"; break; + } + t << "\">" << endl; + + if (md->memberType()!=MemberDef::Define && + md->memberType()!=MemberDef::Enumeration + ) + { + QCString typeStr = replaceAnonymousScopes(md->typeString()); + t << " <type>"; + linkifyText(TextGeneratorXMLImpl(t),scopeName,md->name(),typeStr); + t << "</type>" << endl; + } + + t << " <name>"; + writeXMLString(t,md->name()); + t << "</name>" << endl; + if (isFunc) //function + { + ArgumentList *declAl = new ArgumentList; + ArgumentList *defAl = md->argumentList(); + stringToArgumentList(md->argsString(),declAl); + if (declAl->count()>0) + { + ArgumentListIterator declAli(*declAl); + ArgumentListIterator defAli(*defAl); + Argument *a; + for (declAli.toFirst();(a=declAli.current());++declAli) + { + Argument *defArg = defAli.current(); + t << " <param>" << endl; + if (!a->attrib.isEmpty()) + { + t << " <attributes>"; + writeXMLString(t,a->attrib); + t << "</attributes>" << endl; + } + if (!a->type.isEmpty()) + { + t << " <type>"; + linkifyText(TextGeneratorXMLImpl(t),scopeName,md->name(),a->type); + t << "</type>" << endl; + } + if (!a->name.isEmpty()) + { + t << " <declname>"; + writeXMLString(t,a->name); + t << "</declname>" << endl; + } + if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name) + { + t << " <defname>"; + writeXMLString(t,defArg->name); + t << "</defname>" << endl; + } + if (!a->array.isEmpty()) + { + t << " <array>"; + writeXMLString(t,a->array); + t << "</array>" << endl; + } + if (!a->defval.isEmpty()) + { + t << " <defval>"; + linkifyText(TextGeneratorXMLImpl(t),scopeName,md->name(),a->defval); + t << "</defval>" << endl; + } + t << " </param>" << endl; + if (defArg) ++defAli; + } + } + delete declAl; + } + else if (md->memberType()==MemberDef::Define && + md->argsString()!=0) // define + { + ArgumentListIterator ali(*md->argumentList()); + Argument *a; + for (ali.toFirst();(a=ali.current());++ali) + { + t << " <param><defname>" << a->type << "</defname></param>" << endl; + } + } + if (!md->initializer().isEmpty()) + { + t << " <initializer>"; + linkifyText(TextGeneratorXMLImpl(t),scopeName,md->name(),md->initializer()); + t << "</initializer>" << endl; + } + // TODO: exceptions, const volatile + if (md->memberType()==MemberDef::Enumeration) // enum + { + if (md->enumFieldList()) + { + MemberListIterator emli(*md->enumFieldList()); + MemberDef *emd; + for (emli.toFirst();(emd=emli.current());++emli) + { + t << " <enumvalue>" << endl; + t << " <name>"; + writeXMLString(t,emd->name()); + t << "</name>" << endl; + if (!emd->initializer().isEmpty()) + { + t << " <initializer>"; + writeXMLString(t,emd->initializer()); + t << "</initializer>" << endl; + } + t << " </enumvalue>" << endl; + } + } + } + t << " </memberdef>" << endl; +} + + +void generateXMLClassSection(ClassDef *cd,QTextStream &t,MemberList *ml,const char *kind) +{ + if (ml->count()>0) + { + t << " <sectiondef kind=\"" << kind << "\">" << endl; + //t << " <memberlist>" << endl; + MemberListIterator mli(*ml); + MemberDef *md; + for (mli.toFirst();(md=mli.current());++mli) + { + generateXMLForMember(md,t,cd); + } + //t << " </memberlist>" << endl; + t << " </sectiondef>" << endl; + } +} + +void generateXMLForClass(ClassDef *cd,QTextStream &t) +{ + // brief description + // detailed description + // template arguments + // include files + // inheritance diagram + // list of direct super classes + // list of direct sub classes + // collaboration diagram + // list of all members + // user defined member sections + // standard member sections + // detailed documentation + // detailed member documentation + + if (cd->name().find('@')!=-1) return; // skip anonymous compounds + t << " <compounddef id=\"" + << cd->getOutputFileBase() << "\" kind=\"" + << cd->compoundTypeString() << "\">" << endl; + t << " <compoundname>"; + writeXMLString(t,cd->name()); + t << "</compoundname>" << endl; + if (cd->baseClasses()->count()>0) + { + //t << " <basecompoundlist>" << endl; + BaseClassListIterator bcli(*cd->baseClasses()); + BaseClassDef *bcd; + for (bcli.toFirst();(bcd=bcli.current());++bcli) + { + t << " <basecompoundref idref=\"" + << bcd->classDef->getOutputFileBase() + << "\" prot=\""; + switch (bcd->prot) + { + case Public: t << "public"; break; + case Protected: t << "protected"; break; + case Private: t << "private"; break; + } + t << "\" virt=\""; + switch(bcd->virt) + { + case Normal: t << "non-virtual"; break; + case Virtual: t << "virtual"; break; + case Pure: t <<"pure-virtual"; break; + } + t << "\"/>" << endl; + } + //t << " </basecompoundlist>" << endl; + } + if (cd->subClasses()->count()>0) + { + //t << " <derivedcompoundlist>" << endl; + BaseClassListIterator bcli(*cd->subClasses()); + BaseClassDef *bcd; + for (bcli.toFirst();(bcd=bcli.current());++bcli) + { + t << " <derivedcompoundref idref=\"" + << bcd->classDef->getOutputFileBase() + << "\" prot=\""; + switch (bcd->prot) + { + case Public: t << "public"; break; + case Protected: t << "protected"; break; + case Private: t << "private"; break; + } + t << "\" virt=\""; + switch(bcd->virt) + { + case Normal: t << "non-virtual"; break; + case Virtual: t << "virtual"; break; + case Pure: t << "pure-virtual"; break; + } + t << "\"/>" << endl; + } + //t << " </derivedcompoundlist>" << endl; + } + int numMembers = + cd->pubTypes.count()+cd->pubMembers.count()+cd->pubAttribs.count()+ + cd->pubSlots.count()+cd->signals.count()+cd->dcopMethods.count()+ + cd->pubStaticMembers.count()+ + cd->pubStaticAttribs.count()+cd->proTypes.count()+cd->proMembers.count()+ + cd->proAttribs.count()+cd->proSlots.count()+cd->proStaticMembers.count()+ + cd->proStaticAttribs.count()+cd->priTypes.count()+cd->priMembers.count()+ + cd->priAttribs.count()+cd->priSlots.count()+cd->priStaticMembers.count()+ + cd->priStaticAttribs.count()+cd->friends.count()+cd->related.count(); + if (numMembers>0) + { + //t << " <sectionlist>" << endl; + generateXMLClassSection(cd,t,&cd->pubTypes,"public-type"); + generateXMLClassSection(cd,t,&cd->pubMembers,"public-func"); + generateXMLClassSection(cd,t,&cd->pubAttribs,"public-attrib"); + generateXMLClassSection(cd,t,&cd->pubSlots,"public-slot"); + generateXMLClassSection(cd,t,&cd->signals,"signal"); + generateXMLClassSection(cd,t,&cd->dcopMethods,"dcop-func"); + generateXMLClassSection(cd,t,&cd->properties,"property"); + generateXMLClassSection(cd,t,&cd->pubStaticMembers,"public-static-func"); + generateXMLClassSection(cd,t,&cd->pubStaticAttribs,"public-static-attrib"); + generateXMLClassSection(cd,t,&cd->proTypes,"protected-type"); + generateXMLClassSection(cd,t,&cd->proMembers,"protected-func"); + generateXMLClassSection(cd,t,&cd->proAttribs,"protected-attrib"); + generateXMLClassSection(cd,t,&cd->proSlots,"protected-slot"); + generateXMLClassSection(cd,t,&cd->proStaticMembers,"protected-static-func"); + generateXMLClassSection(cd,t,&cd->proStaticAttribs,"protected-static-attrib"); + generateXMLClassSection(cd,t,&cd->priTypes,"private-type"); + generateXMLClassSection(cd,t,&cd->priMembers,"private-func"); + generateXMLClassSection(cd,t,&cd->priAttribs,"private-attrib"); + generateXMLClassSection(cd,t,&cd->priSlots,"private-slot"); + generateXMLClassSection(cd,t,&cd->priStaticMembers,"private-static-func"); + generateXMLClassSection(cd,t,&cd->priStaticAttribs,"private-static-attrib"); + generateXMLClassSection(cd,t,&cd->friends,"signal"); + generateXMLClassSection(cd,t,&cd->related,"related"); + //t << " </sectionlist>" << endl; + } + t << " </compounddef>" << endl; +} + +void generateXMLFileSection(FileDef *fd,QTextStream &t,MemberList *ml,const char *kind) +{ + if (ml->count()>0) + { + t << " <sectiondef kind=\"" << kind << "\">" << endl; + //t << " <memberlist>" << endl; + MemberListIterator mli(*ml); + MemberDef *md; + for (mli.toFirst();(md=mli.current());++mli) + { + generateXMLForMember(md,t,fd); + } + //t << " </memberlist>" << endl; + t << " </sectiondef>" << endl; + } +} + +void generateXMLForFile(FileDef *fd,QTextStream &t) +{ + t << " <compounddef id=\"" + << fd->getOutputFileBase() << "\" kind=\"file\">" << endl; + t << " <compoundname>"; + writeXMLString(t,fd->name()); + t << "</compoundname>" << endl; + int numMembers = fd->decDefineMembers.count()+fd->decProtoMembers.count()+ + fd->decTypedefMembers.count()+fd->decEnumMembers.count()+ + fd->decFuncMembers.count()+fd->decVarMembers.count(); + if (numMembers>0) + { + //t << " <sectionlist>" << endl; + generateXMLFileSection(fd,t,&fd->decDefineMembers,"define"); + generateXMLFileSection(fd,t,&fd->decProtoMembers,"prototype"); + generateXMLFileSection(fd,t,&fd->decTypedefMembers,"typedef"); + generateXMLFileSection(fd,t,&fd->decEnumMembers,"enum"); + generateXMLFileSection(fd,t,&fd->decFuncMembers,"func"); + generateXMLFileSection(fd,t,&fd->decVarMembers,"var"); + //t << " </sectionlist>" << endl; + } + t << " </compounddef>" << endl; +} + + +void generateXML() +{ + QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY"); + if (outputDirectory.isEmpty()) + { + outputDirectory=QDir::currentDirPath(); + } + else + { + QDir dir(outputDirectory); + if (!dir.exists()) + { + dir.setPath(QDir::currentDirPath()); + if (!dir.mkdir(outputDirectory)) + { + err("Error: tag OUTPUT_DIRECTORY: Output directory `%s' does not " + "exist and cannot be created\n",outputDirectory.data()); + exit(1); + } + else if (!Config_getBool("QUIET")) + { + err("Notice: Output directory `%s' does not exist. " + "I have created it for you.\n", outputDirectory.data()); + } + dir.cd(outputDirectory); + } + outputDirectory=dir.absPath(); + } + + QDir dir(outputDirectory); + if (!dir.exists()) + { + dir.setPath(QDir::currentDirPath()); + if (!dir.mkdir(outputDirectory)) + { + err("Cannot create directory %s\n",outputDirectory.data()); + return; + } + } + QDir xmlDir(outputDirectory+"/xml"); + if (!xmlDir.exists() && !xmlDir.mkdir(outputDirectory+"/xml")) + { + err("Could not create xml directory in %s\n",outputDirectory.data()); + return; + } + + QCString fileName=outputDirectory+"/xml/doxygen.xml"; + QFile f(fileName); + if (!f.open(IO_WriteOnly)) + { + err("Cannot open file %s for writing!\n",fileName.data()); + return; + } + QTextStream t(&f); + t << "<?xml version='1.0' encoding='ISO-8859-1' standalone='yes'?>" << endl; + //t << "<!DOCTYPE doxygen SYSTEM \"doxygen.dtd\">" << endl; + t << "<doxygen>" << endl; + if (Doxygen::classSDict.count()+Doxygen::inputNameList.count()>0) + { + //t << " <compoundlist>" << endl; + ClassSDict::Iterator cli(Doxygen::classSDict); + ClassDef *cd; + for (cli.toFirst();(cd=cli.current());++cli) + { + generateXMLForClass(cd,t); + } + FileNameListIterator fnli(Doxygen::inputNameList); + FileName *fn; + for (;(fn=fnli.current());++fnli) + { + FileNameIterator fni(*fn); + FileDef *fd; + for (;(fd=fni.current());++fni) + { + generateXMLForFile(fd,t); + } + } + //t << " </compoundlist>" << endl; + } + t << "</doxygen>" << endl; +} + + diff --git a/src/xmlgen.h b/src/xmlgen.h new file mode 100644 index 0000000..c762d29 --- /dev/null +++ b/src/xmlgen.h @@ -0,0 +1,20 @@ +/****************************************************************************** + * + * + * + * Copyright (C) 1997-2001 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. + * + */ + +#ifndef XMLGEN_H +#define XMLGEN_H + +void generateXML(); + +#endif |