diff options
67 files changed, 2413 insertions, 772 deletions
@@ -1,6 +1,6 @@ -DOXYGEN Version 1.1.5-20000716 +DOXYGEN Version 1.2.0 Please read the installation section of the manual for instructions. -------- -Dimitri van Heesch (16 July 2000) +Dimitri van Heesch (23 July 2000) @@ -1,4 +1,4 @@ -DOXYGEN Version 1.1.5-20000716 +DOXYGEN Version 1.2.0 Please read INSTALL for compilation instructions. @@ -7,4 +7,4 @@ The latest version of doxygen can be obtained at Enjoy, -Dimitri van Heesch (16 July 2000) +Dimitri van Heesch (23 July 2000) @@ -1 +1 @@ -1.1.5-20000716 +1.2.0 diff --git a/addon/configgen/configgen.cpp b/addon/configgen/configgen.cpp index de0c134..6521c65 100644 --- a/addon/configgen/configgen.cpp +++ b/addon/configgen/configgen.cpp @@ -768,7 +768,7 @@ void init() "information to generate all constant output in the proper language. \n" "The default language is English, other supported languages are: \n" "Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, \n" - "Spanish, Russian, Croatian and Polish.\n" + "Spanish, Russian, Croatian, Polish, and Portuguese.\n" ); ConfigString::addFixedValue("outputLanguage","English"); ConfigString::addFixedValue("outputLanguage","Dutch"); @@ -783,6 +783,7 @@ void init() ConfigString::addFixedValue("outputLanguage","Russian"); ConfigString::addFixedValue("outputLanguage","Croatian"); ConfigString::addFixedValue("outputLanguage","Polish"); + ConfigString::addFixedValue("outputLanguage","Portuguese"); ConfigBool::add( "noIndexFlag", "DISABLE_INDEX", "FALSE", @@ -1310,9 +1311,8 @@ void init() "TRUE", "generate RTF flag", "If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output \n" - "For now this is experimental and is disabled by default. The RTF output \n" - "is optimised for Word 97 and may not look too pretty with other readers \n" - "or editors.\n" + "The RTF output is optimised for Word 97 and may not look very pretty with \n" + "other RTF readers or editors.\n" ); ConfigString::add("rtfOutputDir", "RTF_OUTPUT", @@ -357,6 +357,10 @@ EOF cat >> .tmakeconfig <<EOF TMAKE_LFLAGS = -Bstatic EOF + elif test "$f_platform" = "hpux-cc"; then + cat >> .tmakeconfig <<EOF + TMAKE_LFLAGS = -noshared +EOF else cat >> .tmakeconfig <<EOF TMAKE_LFLAGS = -static diff --git a/doc/Doxyfile b/doc/Doxyfile index 2c5c5e4..9c299b1 100644 --- a/doc/Doxyfile +++ b/doc/Doxyfile @@ -14,8 +14,8 @@ PROJECT_NAME = OUTPUT_DIRECTORY = .. -HTML_HEADER = -HTML_FOOTER = +HTML_HEADER = +HTML_FOOTER = QUIET = NO WARNINGS = YES DISABLE_INDEX = YES @@ -26,11 +26,15 @@ GENERATE_LATEX = YES GENERATE_HTML = YES GENERATE_HTMLHELP = YES GENERATE_RTF = NO +ENABLED_SECTIONS = logo_on ENABLE_PREPROCESSING = NO +CASE_SENSE_NAMES = NO +IMAGE_PATH = . INPUT = index.doc install.doc starting.doc docblocks.doc \ grouping.doc formulas.doc diagrams.doc preprocessing.doc \ external.doc faq.doc trouble.doc history.doc features.doc \ doxygen_usage.doc doxytag_usage.doc doxysearch_usage.doc \ + doxywizard_usage.doc \ installdox_usage.doc output.doc autolink.doc \ config.doc commands.doc htmlcmds.doc language.doc FILE_PATTERNS = *.cpp *.h *.doc diff --git a/doc/commands.doc b/doc/commands.doc index 5617c5b..7791c8b 100644 --- a/doc/commands.doc +++ b/doc/commands.doc @@ -61,6 +61,7 @@ documentation: <li> \refitem cmddeprecated \deprecated <li> \refitem cmddontinclude \dontinclude <li> \refitem cmde \e +<li> \refitem cmdem \em <li> \refitem cmdendcode \endcode <li> \refitem cmdendhtmlonly \endhtmlonly <li> \refitem cmdendif \endif @@ -84,13 +85,16 @@ documentation: <li> \refitem cmdinternal \internal <li> \refitem cmdinvariant \invariant <li> \refitem cmdlatexonly \latexonly +<li> \refitem cmdli \li <li> \refitem cmdline \line <li> \refitem cmdlink \link <li> \refitem cmdmainpage \mainpage <li> \refitem cmdname \name <li> \refitem cmdnamespace \namespace <li> \refitem cmdnosubgrouping \nosubgrouping +<li> \refitem cmdnote \note <li> \refitem cmdoverload \overload +<li> \refitem cmdp \p <li> \refitem cmdpage \page <li> \refitem cmdpar \par <li> \refitem cmdparam \param @@ -165,17 +169,6 @@ Doxygen. Unrecognized commands are treated as normal text. \endhtmlonly <hr> -\subsection cmdcode \code - - \addindex \code - Starts a block of code. A code block is treated differently - from ordinary text. It is interpreted as C/C++ code. The names of the - classes and members that are documented are automatically replaced by - links to the documentation. - - \sa section \ref cmdendcode "\\endcode", section \ref cmdverbatim "\\verbatim" - -<hr> \subsection cmddef \def <name> \addindex \def @@ -185,7 +178,7 @@ Doxygen. Unrecognized commands are treated as normal text. \par Example: \verbinclude define.h \htmlonly - Click <a href="$(DOXYGEN_DOCDIR)/examples/define/html/index.html">here</a> + Click <a href="$(DOXYGEN_DOCDIR)/examples/define/html/define.h.html">here</a> for the corresponding HTML documentation that is generated by Doxygen. \endhtmlonly @@ -204,13 +197,6 @@ Doxygen. Unrecognized commands are treated as normal text. \sa section \ref cmdingroup "\\ingroup" <hr> -\subsection cmdendcode \endcode - - \addindex \endcode - Ends a block of code. - \sa section \ref cmdcode "\\code" - -<hr> \subsection cmdenum \enum <name> @@ -229,7 +215,7 @@ Doxygen. Unrecognized commands are treated as normal text. \par Example: \verbinclude enum.h \htmlonly - Click <a href="$(DOXYGEN_DOCDIR)/examples/enum/html/index.html">here</a> + Click <a href="$(DOXYGEN_DOCDIR)/examples/enum/html/class_test.html">here</a> for the corresponding HTML documentation that is generated by Doxygen. \endhtmlonly @@ -260,7 +246,7 @@ Doxygen. Unrecognized commands are treated as normal text. Where the example file \c example_test.cpp looks as follows: \verbinclude example_test.cpp \htmlonly - Click <a href="$(DOXYGEN_DOCDIR)/examples/example/html/index.html">here</a> + Click <a href="$(DOXYGEN_DOCDIR)/examples/example/html/examples.html">here</a> for the corresponding HTML documentation that is generated by Doxygen. \endhtmlonly @@ -283,7 +269,7 @@ Doxygen. Unrecognized commands are treated as normal text. \par Example: \verbinclude file.h \htmlonly - Click <a href="$(DOXYGEN_DOCDIR)/examples/file/html/index.html">here</a> + Click <a href="$(DOXYGEN_DOCDIR)/examples/file/html/file.h.html">here</a> for the corresponding HTML documentation that is generated by Doxygen. \endhtmlonly @@ -412,6 +398,8 @@ Public/Protected/Private/... section. \par Note 1: You are responsible that there is indeed an earlier documented member that is overloaded by this one. + To prevent that document reorders the documentation you should set + \ref cfg_sort_member_docs "SORT_MEMBER_DOCS" to NO in this case. \par Note 2: The \\overload command does not work inside a one-line comment. \par Example: @@ -685,6 +673,20 @@ Public/Protected/Private/... section. sectioning command is encountered. <hr> +\subsection cmdnote \note { text } + + \addindex \note + Starts a paragraph where a note can be entered. The paragraph will be + indented. The text of the paragraph has no special internal structure. + All visual enhancement commands may be used inside the paragraph. + Multiple adjacent \\note commands will be joined into a single paragraph. + Each note description will start on a new line. + Alternatively, one \\note command may mention + several notes. The \\note command ends when a blank line or some other + sectioning command is encountered. See section \ref cmdpar "\\par" + for an example. + +<hr> \subsection cmdpar \par [(paragraph title)] { paragraph } \addindex \par @@ -797,10 +799,11 @@ Public/Protected/Private/... section. \addindex \sa Starts a paragraph where one or more cross-references to classes, functions, methods, variables, files or URL may be specified. - The separators \c :: and \c # may be used to separate a class from the - name of its members. One of several overloaded methods or constructors + Two names joines by either <code>::</code> or <code>\#</code> + are understood as referring to a class and one of its members. + One of several overloaded methods or constructors may be selected by including a parenthesized list of argument types after - the method. + the method name. Synonymous to \\see. @@ -1112,11 +1115,11 @@ Public/Protected/Private/... section. \par Example: \verbatim - ... the \a x and \y coordinates are used to ... + ... the \a x and \a y coordinates are used to ... \endverbatim This will result in the following text:<br><br> ... the \a x and \a y coordinates are used to ... - + <hr> \subsection cmdarg \arg { item-description } @@ -1147,6 +1150,9 @@ Public/Protected/Private/... section. \par Note: For nested lists, HTML commands should be used. + Equivalent to \ref cmdli "\\cmdli" + + <hr> \subsection cmdb \b <word> @@ -1170,6 +1176,19 @@ Public/Protected/Private/... section. will result in the following text:<br><br> ... This function returns \c void and not \c int ... + Equivalent to \ref cmdp "\\cmdp" + +<hr> +\subsection cmdcode \code + + \addindex \code + Starts a block of code. A code block is treated differently + from ordinary text. It is interpreted as C/C++ code. The names of the + classes and members that are documented are automatically replaced by + links to the documentation. + + \sa section \ref cmdendcode "\\endcode", section \ref cmdverbatim "\\verbatim" + <hr> \subsection cmde \e <word> @@ -1185,6 +1204,32 @@ Public/Protected/Private/... section. will result in the following text:<br><br> ... this is a \e really good example ... + Equvalent to \ref cmdem "\\em" + +<hr> +\subsection cmdem \em <word> + + \addindex \e + Displays the argument \<word\> in italics. + Use this command to emphasize words. + + \par Example: + Typing: + \verbatim + ... this is a \em really good example ... + \endverbatim + will result in the following text:<br><br> + ... this is a \em really good example ... + + Equivalent to \ref cmde "\\e" + +<hr> +\subsection cmdendcode \endcode + + \addindex \endcode + Ends a block of code. + \sa section \ref cmdcode "\\code" + <hr> \subsection cmdendhtmlonly \endhtmlonly @@ -1322,6 +1367,55 @@ Public/Protected/Private/... section. and section \ref cmdhtmlonly "\\htmlonly". <hr> +\subsection cmdli \li { item-description } + + \addindex \li + This command has one argument that continues until the first + blank line or until another \\li is encountered. + The command can be used to generate a simple, not nested list of + arguments. + Each argument should start with a \\li command. + + \par Example: + Typing: + \verbatim + \li \c AlignLeft left alignment. + \li \c AlignCenter center alignment. + \li \c AlignRight right alignment + + No other types of alignment are supported. + \endverbatim + will result in the following text:<br><br> + <ul> + <li> \c AlignLeft left alignment. + <li> \c AlignCenter center alignment. + <li> \c AlignRight right alignment + </ul><br> + No other types of alignment are supported. + + \par Note: + For nested lists, HTML commands should be used. + + Equivalent to \ref cmdarg "\\cmdarg" + +<hr> +\subsection cmdp \p <word> + + \addindex \p + Displays the parameter \<word\> using a typewriter font. + You can use this command to refer to member function parameters in + the running text. + + \par Example: + \verbatim + ... the \p x and \p y coordinates are used to ... + \endverbatim + This will result in the following text:<br><br> + ... the \p x and \p y coordinates are used to ... + + Equivalent to \ref cmdc "\\cmdc" + +<hr> \subsection cmdverbatim \verbatim \addindex \verbatim diff --git a/doc/config.doc b/doc/config.doc index fa9d86b..7581b99 100644 --- a/doc/config.doc +++ b/doc/config.doc @@ -21,8 +21,7 @@ \subsection config_format Format A configuration file is a free-form ASCII text file with a structure that -is similar to that of a Makefile. It is parsed by a -recursive-descent parser that is built into \c doxygen. +is similar to that of a Makefile. It is parsed by \c doxygen. The file may contain tabs and newlines for formatting purposes. The statements in the file are case-sensitive. Comments may be placed anywhere within the file (except within quotes). @@ -189,7 +188,7 @@ followed by the descriptions of the tags grouped by category. information to generate all constant output in the proper language. The default language is English, other supported languages are: Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, - Spanish, Russian, Croatian and Polish. + Spanish, Russian, Croatian, Polish and Portuguese. \anchor cfg_disable_index <dt>\c DISABLE_INDEX <dd> @@ -423,7 +422,8 @@ followed by the descriptions of the tags grouped by category. <dt>\c WARN_FORMAT <dd> \addindex WARN_FORMAT The WARN_FORMAT tag determines the format of the warning messages that - doxygen can produce. The string should contain the $file, $line, and $text + doxygen can produce. The string should contain the <code>\$file</code>, + <code>\$line</code>, and <code>\$text</code> tags, which will be replaced by the file and line number from which the warning originated and the warning text. @@ -559,7 +559,9 @@ followed by the descriptions of the tags grouped by category. \addindex HTML_HEADER The \c HTML_HEADER tag can be used to specify a user defined HTML header file for each generated HTML page. To get valid HTML the header file - should contain at least a \c <HTML> and a \c <BODY> tag. Example: + should contain at least a \c <HTML> and a \c <BODY> tag, but it is + good idea to include the style sheet that is generated by doxygen as well. + Minimal example: \verbatim <HTML> <HEAD> @@ -580,12 +582,15 @@ followed by the descriptions of the tags grouped by category. the version number of doxygen, the project name (see \c PROJECT_NAME), or the project number (see \c PROJECT_NUMBER). + See also section \ref doxygen_usage for information on how to generate + the default header that doxygen normally uses. + \anchor cfg_html_footer <dt>\c HTML_FOOTER <dd> \addindex HTML_FOOTER The \c HTML_FOOTER tag can be used to specify a user defined HTML footer for each generated HTML page. To get valid HTML the header file should contain - at least a \c </BODY> and a \c </HTML> tag. Example: + at least a \c </BODY> and a \c </HTML> tag. A minimal example: \verbatim </BODY> </HTML> @@ -600,7 +605,9 @@ followed by the descriptions of the tags grouped by category. the title of the page, the current date and time, only the current date, the version number of doxygen, the project name (see \c PROJECT_NAME), or the project number (see \c PROJECT_NUMBER). - + + See also section \ref doxygen_usage for information on how to generate + the default footer that doxygen normally uses. \anchor cfg_html_stylesheet <dt>\c HTML_STYLESHEET <dd> @@ -608,32 +615,10 @@ followed by the descriptions of the tags grouped by category. The \c HTML_STYLESHEET tag can be used to specify a user defined cascading style sheet that is used by each HTML page. It can be used to fine-tune the look of the HTML output. If the tag is left blank doxygen - will generate a default style sheet. Here is the default style sheet - that doxygen normally generates: + will generate a default style sheet. -\verbatim -H1 { text-align: center; } -A.qindex {} -A.qindexRef {} -A.el { text-decoration: none; font-weight: bold } -A.elRef { font-weight: bold } -A.code { text-decoration: none; font-weight: normal; color: #4444ee } -A.codeRef { font-weight: normal; color: #4444ee } -DL.el { margin-left: -1cm } -DIV.fragment { width: 100%; border: none; background-color: #eeeeee } -DIV.in { margin-left: 16 } -DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 } -TD.md { background-color: #f2f2ff } -DIV.groupHeader { margin-left: 16; margin-top: 12; margin-bottom: 6; font-weight -DIV.groupText { margin-left: 16; font-style: italic; font-size: smaller } -FONT.keyword { color: #008000 } -FONT.keywordtype { color: #604020 } -FONT.keywordflow { color: #e08000 } -FONT.comment { color: #800000 } -FONT.preprocessor { color: #806020 } -FONT.stringliteral { color: #002080 } -FONT.charliteral { color: #008080 } -\endverbatim + See also section \ref doxygen_usage for information on how to generate + the style sheet that doxygen normally uses. \anchor cfg_html_align_members <dt>\c HTML_ALIGN_MEMBERS <dd> @@ -724,32 +709,11 @@ EXTRA_PACKAGES = times \addindex LATEX_HEADER The \c LATEX_HEADER tag can be used to specify a personal \f$\mbox{\LaTeX}\f$ header for the generated latex document. The header should contain everything - until the first chapter. If it is left blank doxygen will generate a - standard header, which looks as follows for the default - configuration settings: + until the first chapter. -\verbatim -\documentclass[a4paper]{book} -\usepackage{a4wide} -\usepackage{makeidx} -\usepackage{fancyheadings} -\usepackage{epsfig} -\usepackage{float} -\usepackage{doxygen} -\makeindex -\setcounter{tocdepth}{1} -\setlength{\footrulewidth}{0.4pt} -\begin{document} -\title{Reference Manual} -\author{Generated by Doxygen} -\date{Thu Sep 30 19:58:32 1999} -\maketitle -\pagenumbering{roman} -\clearemptydoublepage -\tableofcontents -\clearemptydoublepage -\pagenumbering{arabic} -\endverbatim + If it is left blank doxygen will generate a + standard header. See section \ref doxygen_usage for information on how to + let doxygen write the default header to a separate file. \par Note: Only use a user defined header if you know what you are doing! @@ -790,8 +754,7 @@ EXTRA_PACKAGES = times <dt>\c GENERATE_RTF <dd> \addindex GENERATE_RTF If the \c GENERATE_RTF tag is set to \c YES Doxygen will generate RTF output. - For now this is experimental and is disabled by default. The RTF - output is optimised for Word 97 and may not look too pretty with + The RTF output is optimised for Word 97 and may not look too pretty with other readers/editors. \anchor cfg_rtf_output @@ -820,89 +783,15 @@ EXTRA_PACKAGES = times \par note: wordpad (write) and others do not support links. -\anchor cfg_rtf_stylesheet_file RTF_STYLESHEET_FILE +\anchor cfg_rtf_stylesheet_file <dt>\c RTF_STYLESHEET_FILE <dd> \addindex RTF_STYLESHEET_FILE Load stylesheet definitions from file. Syntax is similar to doxygen's config file, i.e. a series of assigments. You only have to provide replacements, missing definitions are set to their default value. -\htmlonly -Here are the default settings: -<font size=2><pre>Reset = \\pard\\plain -Heading1 = \\s1\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs36\\kerning36\\cgrid -Heading2 = \\s2\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs28\\kerning28\\cgrid -Heading3 = \\s3\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\cgrid -Heading4 = \\s4\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid -Title = \\s15\\qc\\sb240\\sa60\\widctlpar\\outlinelevel0\\adjustright \\b\\f1\\fs32\\kerning28\\cgrid -SubTitle = \\s16\\qc\\sa60\\widctlpar\\outlinelevel1\\adjustright \\f1\\cgrid -BodyText = \\s17\\sa60\\sb30\\widctlpar\\qj \\fs22\\cgrid -DenseText = \\s18\\widctlpar\\fs22\\cgrid -Header = \\s28\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright \\fs20\\cgrid -Footer = \\s29\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\qr\\adjustright \\fs20\\cgrid -GroupHeader = \\s30\\li360\\sa60\\sb120\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid -CodeExample0 = \\s40\\li0\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid -CodeExample1 = \\s41\\li360\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid -CodeExample2 = \\s42\\li720\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid -CodeExample3 = \\s43\\li1080\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid -CodeExample4 = \\s44\\li1440\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid -CodeExample5 = \\s45\\li1800\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid -CodeExample6 = \\s46\\li2160\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid -CodeExample7 = \\s47\\li2520\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid -CodeExample8 = \\s48\\li2880\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid -CodeExample9 = \\s49\\li3240\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid -ListContinue0 = \\s50\\li0\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid -ListContinue1 = \\s51\\li360\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid -ListContinue2 = \\s52\\li720\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid -ListContinue3 = \\s53\\li1080\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid -ListContinue4 = \\s54\\li1440\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid -ListContinue5 = \\s55\\li1800\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid -ListContinue6 = \\s56\\li2160\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid -ListContinue7 = \\s57\\li2520\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid -ListContinue8 = \\s58\\li2880\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid -ListContinue9 = \\s59\\li3240\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid -DescContinue0 = \\s60\\li0\\widctlpar\\ql\\adjustright \\fs20\\cgrid -DescContinue1 = \\s61\\li360\\widctlpar\\ql\\adjustright \\fs20\\cgrid -DescContinue2 = \\s62\\li720\\widctlpar\\ql\\adjustright \\fs20\\cgrid -DescContinue3 = \\s63\\li1080\\widctlpar\\ql\\adjustright \\fs20\\cgrid -DescContinue4 = \\s64\\li1440\\widctlpar\\ql\\adjustright \\fs20\\cgrid -DescContinue5 = \\s65\\li1800\\widctlpar\\ql\\adjustright \\fs20\\cgrid -DescContinue6 = \\s66\\li2160\\widctlpar\\ql\\adjustright \\fs20\\cgrid -DescContinue7 = \\s67\\li2520\\widctlpar\\ql\\adjustright \\fs20\\cgrid -DescContinue8 = \\s68\\li2880\\widctlpar\\ql\\adjustright \\fs20\\cgrid -DescContinue9 = \\s69\\li3240\\widctlpar\\ql\\adjustright \\fs20\\cgrid -LatexTOC0 = \\s70\\li0\\sa30\\sb30\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid -LatexTOC1 = \\s71\\li360\\sa27\\sb27\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid -LatexTOC2 = \\s72\\li720\\sa24\\sb24\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid -LatexTOC3 = \\s73\\li1080\\sa21\\sb21\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid -LatexTOC4 = \\s74\\li1440\\sa18\\sb18\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid -LatexTOC5 = \\s75\\li1800\\sa15\\sb15\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid -LatexTOC6 = \\s76\\li2160\\sa12\\sb12\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid -LatexTOC7 = \\s77\\li2520\\sa9\\sb9\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid -LatexTOC8 = \\s78\\li2880\\sa6\\sb6\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid -LatexTOC9 = \\s79\\li3240\\sa3\\sb3\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid -ListBullet0 = \\s80\\fi-360\\li360\\widctlpar\\jclisttab\\tx360{\\*\\pn \\pnlvlbody\\ilvl0\\ls1\\pnrnot0\\pndec }\\ls1\\adjustright \\fs20\\cgrid -ListBullet1 = \\s81\\fi-360\\li720\\widctlpar\\jclisttab\\tx720{\\*\\pn \\pnlvlbody\\ilvl0\\ls2\\pnrnot0\\pndec }\\ls2\\adjustright \\fs20\\cgrid -ListBullet2 = \\s82\\fi-360\\li1080\\widctlpar\\jclisttab\\tx1080{\\*\\pn \\pnlvlbody\\ilvl0\\ls3\\pnrnot0\\pndec }\\ls3\\adjustright \\fs20\\cgrid -ListBullet3 = \\s83\\fi-360\\li1440\\widctlpar\\jclisttab\\tx1440{\\*\\pn \\pnlvlbody\\ilvl0\\ls4\\pnrnot0\\pndec }\\ls4\\adjustright \\fs20\\cgrid -ListBullet4 = \\s84\\fi-360\\li1800\\widctlpar\\jclisttab\\tx1800{\\*\\pn \\pnlvlbody\\ilvl0\\ls5\\pnrnot0\\pndec }\\ls5\\adjustright \\fs20\\cgrid -ListBullet5 = \\s85\\fi-360\\li2160\\widctlpar\\jclisttab\\tx2160{\\*\\pn \\pnlvlbody\\ilvl0\\ls6\\pnrnot0\\pndec }\\ls6\\adjustright \\fs20\\cgrid -ListBullet6 = \\s86\\fi-360\\li2520\\widctlpar\\jclisttab\\tx2520{\\*\\pn \\pnlvlbody\\ilvl0\\ls7\\pnrnot0\\pndec }\\ls7\\adjustright \\fs20\\cgrid -ListBullet7 = \\s87\\fi-360\\li2880\\widctlpar\\jclisttab\\tx2880{\\*\\pn \\pnlvlbody\\ilvl0\\ls8\\pnrnot0\\pndec }\\ls8\\adjustright \\fs20\\cgrid -ListBullet8 = \\s88\\fi-360\\li3240\\widctlpar\\jclisttab\\tx3240{\\*\\pn \\pnlvlbody\\ilvl0\\ls9\\pnrnot0\\pndec }\\ls9\\adjustright \\fs20\\cgrid -ListBullet9 = \\s89\\fi-360\\li3600\\widctlpar\\jclisttab\\tx3600{\\*\\pn \\pnlvlbody\\ilvl0\\ls10\\pnrnot0\\pndec }\\ls10\\adjustright \\fs20\\cgrid -ListEnum0 = \\s90\\fi-360\\li360\\widctlpar\\fs20\\cgrid -ListEnum1 = \\s91\\fi-360\\li720\\widctlpar\\fs20\\cgrid -ListEnum2 = \\s92\\fi-360\\li1080\\widctlpar\\fs20\\cgrid -ListEnum3 = \\s93\\fi-360\\li1440\\widctlpar\\fs20\\cgrid -ListEnum4 = \\s94\\fi-360\\li1800\\widctlpar\\fs20\\cgrid -ListEnum4 = \\s95\\fi-360\\li2160\\widctlpar\\fs20\\cgrid -ListEnum5 = \\s96\\fi-360\\li2520\\widctlpar\\fs20\\cgrid -ListEnum6 = \\s97\\fi-360\\li2880\\widctlpar\\fs20\\cgrid -ListEnum7 = \\s98\\fi-360\\li3240\\widctlpar\\fs20\\cgrid -ListEnum8 = \\s99\\fi-360\\li3600\\widctlpar\\fs20\\cgrid -</pre></font> -\endhtmlonly + See also section \ref doxygen_usage for information on how to generate + the default style sheet that doxygen normally uses. </dl> @@ -1247,6 +1136,35 @@ INCLUDE_PATH = $(QTDIR)/include RECURSIVE = YES \endverbatim +For the Qt-2.1 sources I recommand to use the following settings: +\verbatim +PROJECT_NAME = Qt +PROJECT_NUMBER = 2.1 +HIDE_UNDOC_MEMBERS = YES +HIDE_UNDOC_CLASSES = YES +SOURCE_BROWSER = YES +INPUT = $(QTDIR)/src +FILE_PATTERNS = *.cpp *.h q*.doc +RECURSIVE = YES +EXCLUDE_PATTERNS = *codec.cpp moc_* */compat/* */3rdparty/* +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 3 +IGNORE_PREFIX = Q +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +INCLUDE_PATH = $(QTDIR)/include +PREDEFINED = Q_PROPERTY(x)= \ + Q_OVERRIDE(x)= \ + Q_EXPORT= \ + Q_ENUMS(x)= \ + "QT_STATIC_CONST=static const " \ + _WS_X11_ \ + INCLUDE_MENUITEM_DEF +EXPAND_ONLY_PREDEF = YES +EXPAND_AS_DEFINED = Q_OBJECT_FAKE Q_OBJECT ACTIVATE_SIGNAL_WITH_PARAM \ + Q_VARIANT_AS +\endverbatim + Here Doxygen's preprocessor is used to substitute some macro names that are normally substituted by the C preprocessor, but without doing full macro expansion. diff --git a/doc/doxygen_usage.doc b/doc/doxygen_usage.doc index f781000..d8f4d2f 100644 --- a/doc/doxygen_usage.doc +++ b/doc/doxygen_usage.doc @@ -17,16 +17,17 @@ /*! \page doxygen_usage Doxygen usage Doxygen is a command line based utility. Calling \c doxygen with the -\c -h option at the command line will give you a brief description of the +\c --help option at the command line will give you a brief description of the usage of the program. All options consist of a leading character <tt>-</tt>, -followed by one character and optionally an argument. +followed by one character and one or more arguments depending on the option. -To generate a class browser you typically need to follow these steps: +To generate a manual for your project you typically +need to follow these steps: <ol> <li> You document your source code with - special documentation blocks. + special documentation blocks (see section \ref specialblock). <li> You generate a configuration file (see section \ref config) by calling doxygen with the \c -g option: \verbatim @@ -42,12 +43,50 @@ doxygen <config_file> \endverbatim </ol> +If you have a configuration file generated with an older version of +doxygen that you can upgrade it to the current version by running doxygen +with the -u option. +\verbatim +doxygen -u <config_file> +\endverbatim +All configuration settings in the orginal configuration file will be copied +to the new configuration file. Any new options will have their default value. +Note that comments that you may have added in the original configuration file +will be lost. + +If you want to fine-tune the way the output looks, doxygen allows you +generate default style sheet, header, and footer files that you can edit +afterwards: +<ul> +<li>For HTML output, you can generate the default header file + (see \ref cfg_html_header "HTML_HEADER"), the default footer + (see \ref cfg_html_footer "HTML_FOOTER"), and the default style + sheet (see \ref cfg_html_stylesheet "HTML_STYLESHEET"), using the + following command: +\verbatim +doxygen -w html header.html footer.html stylesheet.css +\endverbatim +<li>For LaTeX output, you can generate the first part of \c refman.tex + (see \ref cfg_latex_header "LATEX_HEADER") and the style sheet included + by that header (normally <code>doxygen.sty</code>), using: +\verbatim +doxygen -w latex header.tex doxygen.sty +\endverbatim +<li>For RTF output, you can generate the default style sheet file (see + \ref cfg_rtf_stylesheet_file "RTF_STYLESHEET_FILE") using: +\verbatim +doxygen -w rtf rtfstyle.cfg +\endverbatim +</ul> + <b>Note:</b><br> <ul> -<li> If you do not want the description for each item in the configuration - file then you can use the optional \c -s option. - Try to use this option if you send me a configuration file as part of - a bug report! +<li> If you do not want documentation for each item inside the configuration + file then you can use the optional \c -s option. This can use be + used in combination with the \c -u option, to add or strip the + documentation from an existing configuration file. + Please use the \c -s this option if you send me a configuration file + as part of a bug report! <li> To make doxygen read/write to standard input/output instead of from/to a file, use \c - for the file name. </ul> diff --git a/doc/doxywizard.gif b/doc/doxywizard.gif Binary files differnew file mode 100644 index 0000000..80bb636 --- /dev/null +++ b/doc/doxywizard.gif diff --git a/doc/doxywizard_usage.doc b/doc/doxywizard_usage.doc new file mode 100644 index 0000000..59c7227 --- /dev/null +++ b/doc/doxywizard_usage.doc @@ -0,0 +1,50 @@ +/****************************************************************************** + * + * + * + * 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. + * + */ +/*! \page doxywizard_usage Doxywizard usage + +Doxywizard is a GUI front-end for creating and editing +configuration files that are used by doxygen. + +Doxywizard consists of a single executable that, when started, +pops up a window. + +The main window has a number of tab field, one +for each section in the configuration file. Each tab-field +contains a number of lines, one for each configuration option in +that section. + +The kind of input widget depends on the type of the configuration option. +<ul> +<li>For each boolean option (those options that are answered with YES or + NO in the configuration file) there is a check-box. +<li>For items taking one of a fixed set of values (like + \ref cfg_output_language "OUTPUT_LANGUAGE") a combo box is used. +<li>For items taking an integer value from a range, a spinbox is used. +<li>For free form string-type options there is a one line edit field +<li>For options taking a lists of strings, a one line edit field is + available, with a `+' button to add this string to the list and + a `-' button to remove the selected string from the list. There + is also a button with a circular "refresh" arrow that, when pressed, + replaces the selected item in the list with the string entered in the + edit field. +<li>For file and folder entries, there are special buttons + that start a file dialog. +</ul> + +\image html doxywizard.gif + +*/ diff --git a/doc/history.doc b/doc/history.doc index aaa7e21..beee457 100644 --- a/doc/history.doc +++ b/doc/history.doc @@ -38,7 +38,7 @@ parser and GUI front-end from source templates. <li>Better support for the using keyword. <li>New transparent mini logo that is put in the footer of all HTML pages. -<li>Internationalization support for the Polish and Croatian language. +<li>Internationalization support for the Polish, Portuguese and Croatian language. <li>Todo list support. <li>If the source browser is enabled, for a function, a list of function whose implementation calls that function, is generated. diff --git a/doc/index.doc b/doc/index.doc index 6256799..198bf46 100644 --- a/doc/index.doc +++ b/doc/index.doc @@ -15,6 +15,7 @@ * */ /*! \page index +\if logo_on <center> \htmlonly <img align=center lowsrc="doxygen_logo_low.gif" src="doxygen_logo.gif" @@ -22,6 +23,7 @@ Version: $(VERSION) \endhtmlonly </center> +\endif <h2>Doxygen license</h2> \addindex license @@ -105,6 +107,7 @@ The second part forms a reference manual: <li>Section \ref doxygen_usage shows how to use the \c doxygen program. <li>Section \ref doxytag_usage shows how to use the \c doxytag program. <li>Section \ref doxysearch_usage shows how to use the \c doxysearch program. +<li>Section \ref doxywizard_usage shows how to use the \c doxywizard program. <li>Section \ref installdox_usage shows how to use the \c installdox script that is generated by Doxygen if you use tag files. <li>Section \ref output shows how to generate the various output formats diff --git a/doc/install.doc b/doc/install.doc index c03a529..2d31184 100644 --- a/doc/install.doc +++ b/doc/install.doc @@ -92,7 +92,11 @@ Compilation is now done by performing the following steps: If you have Qt-2.1.x installed and want to build the GUI front-end, you should run the configure script with the <code>--with-doxywizard</code> - option. + option: + +\verbatim + configure --with-doxywizard +\endverbatim For an overview of other configuration options use @@ -216,6 +220,9 @@ If you are compiling for HP-UX with aCC and you get this error: #include <alloca.h> \endverbatim + If that does not help, try removing <code>ce_parse.cpp</code> and let + bison rebuilt it (this worked for me). + If you are compiling for Digital Unix, the same problem can be solved (according to Barnard Schmallhof) by replacing the following in ce_parse.cpp: @@ -256,7 +263,50 @@ ce_parse.cpp: <b>Sun compiler problems</b> +I tried compiling doxygen only with Sun's C++ WorkShop Compiler +version 5.0 (I used <code>./configure --platform solaris-cc</code>) + +Qt-2.x.x is required for this compiler (Qt-1.44 has problems with the bool +type). + +Compiling the \c doxygen binary went ok, but while linking <code>doxytag</code> I got a +lot of link errors, like these: + +\verbatim +QList<PageInfo>::__vtbl /home/dimitri/doxygen/objects/SunWS_cache/CC_obj_6/6c3eO4IogMT2vrlGCQUQ.o +[Hint: try checking whether the first non-inlined, non-pure virtual function of class QList<PageInfo> is defined] +\endverbatim + +These are generated because the compiler is confused about the object sharing +between \c doxygen and \c doxytag. To compile \c doxytag and \c doxysearch +anyway do: +\verbatim +rm -rf objects +mkdir objects +cd src +gmake -f Makefile.doxytag +gmake -f Makefile.doxysearch +\endverbatim + +when configuring with <code>--static</code> I got: + +\verbatim +Undefined first referenced + symbol in file +dlclose /usr/lib/libc.a(nss_deffinder.o) +dlsym /usr/lib/libc.a(nss_deffinder.o) +dlopen /usr/lib/libc.a(nss_deffinder.o) +\endverbatim + +Manually adding <code>-Bdynamic</code> after the target rule in +<code>Makefile.doxygen</code> and <code>Makefile.doxytag</code> +will fix this: + +\verbatim +$(TARGET): $(OBJECTS) $(OBJMOC) + $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) -Bdynamic +\endverbatim <b>GNU 2.7.2.x compiler problems</b> diff --git a/doc/starting.doc b/doc/starting.doc index 332d1d2..23c6268 100644 --- a/doc/starting.doc +++ b/doc/starting.doc @@ -29,6 +29,9 @@ information. The executable \c doxysearch is only needed if you want to use the search engine. See section \ref doxysearch_usage for more detailed usage information. +Optionally, the executable \c doxywizard is a GUI front-end for editing +the configuration files that are used by doxygen. + \subsection step1 Step 1: Creating a configuration file Doxygen uses a configuration file to determine all of its settings. @@ -129,14 +132,16 @@ documentation, \c doxygen writes a \c Makefile into the \c latex directory. By typing \c make in the \c latex directory the dvi file \c refman.dvi will be generated (provided that you have a make tool called <code>make</code> ofcourse). This file can then be viewed using \c xdvi or -converted into a postscript file \c refman.ps by typing <code>make ps</code> -(this requires <code>dvips</code>). The Postscript file can be send to a postscript +converted into a postscript file \c refman.ps by +typing <code>make ps</code> (this requires <code>dvips</code>). +To put 2 pages on one physical page use <code>make ps_2on1</code> instead. +The resulting Postscript file can be send to a postscript printer. If you do not have a postscript printer, you can try to use ghostscript to convert postscript into something your printer understands. Conversion to PDF is also possible if you have installed the ghostscript -interpreter; just type <code>make pdf</code>. To get the best results for -PDF output you should set the \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS" -tag to \c YES. +interpreter; just type <code>make pdf</code> (or <code>make pdf_2on1</code>). +To get the best results for PDF output you should set +the \ref cfg_pdf_hyperlinks "PDF_HYPERLINKS" tag to \c YES. The generated man pages can be viewed using the \c man program. You do need to make sure the man directory is in the man path (see the \c MANPATH diff --git a/doc/trouble.doc b/doc/trouble.doc index 3fac65e..1f309bc 100644 --- a/doc/trouble.doc +++ b/doc/trouble.doc @@ -80,12 +80,24 @@ know why. Furthermore, I would appreciate a mail if you have found a bug, or if you have ideas (or even better some code or a patch) -how to fix existing bugs and limitations. +how to fix existing bugs and limitations. For patches please use +"diff -u" + +<h2>How to report a bug</h2> + +If you think you have found a bug in doxygen, please report it so I can +fix it. + +Always include the following information in your bug report: +- The version of doxygen you are using. +- The name and version number of your operating system The easiest way for me to solve bugs is if you can send me a small example -demonstrating the problem you have (make sure the example compiles!). It is -usually a good idea to send along the configuation file as well, but please -use doxygen with the <code>-s</code> flag while generating it. +demonstrating the problem you have. Please make sure the example is valid +source code (try compiling it) and if the problem is really captured by +the example. +It is usually a good idea to send along the configuation file as well, +but please use doxygen with the <code>-s</code> flag while generating it. My e-mail address: <a href="mailto:dimitri@stack.nl">dimitri@stack.nl</a> */ diff --git a/examples/afterdoc.cfg b/examples/afterdoc.cfg index c81b7e6..eb796da 100644 --- a/examples/afterdoc.cfg +++ b/examples/afterdoc.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = afterdoc GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = afterdoc.h QUIET = YES diff --git a/examples/author.cfg b/examples/author.cfg index 427f507..62cf8bb 100644 --- a/examples/author.cfg +++ b/examples/author.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = author GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = author.cpp QUIET = YES diff --git a/examples/autolink.cfg b/examples/autolink.cfg index 46cc432..ae590b0 100644 --- a/examples/autolink.cfg +++ b/examples/autolink.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = autolink GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = autolink.cpp QUIET = YES diff --git a/examples/class.cfg b/examples/class.cfg index 0402271..24b7e44 100644 --- a/examples/class.cfg +++ b/examples/class.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = class GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = class.h QUIET = YES diff --git a/examples/define.cfg b/examples/define.cfg index 711a29e..22d2a65 100644 --- a/examples/define.cfg +++ b/examples/define.cfg @@ -3,6 +3,7 @@ OUTPUT_DIRECTORY = define GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = define.h ENABLE_PREPROCESSING = YES QUIET = YES diff --git a/examples/diagrams.cfg b/examples/diagrams.cfg index 9a346d6..4cb3b7e 100644 --- a/examples/diagrams.cfg +++ b/examples/diagrams.cfg @@ -5,6 +5,7 @@ EXTRACT_ALL = YES GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO ENABLE_PREPROCESSING = YES INPUT = . FILE_PATTERNS = diagrams_*.h diff --git a/examples/enum.cfg b/examples/enum.cfg index 718ed85..36d1370 100644 --- a/examples/enum.cfg +++ b/examples/enum.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = enum GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = enum.h QUIET = YES diff --git a/examples/example.cfg b/examples/example.cfg index 06d5b0b..d157917 100644 --- a/examples/example.cfg +++ b/examples/example.cfg @@ -4,6 +4,7 @@ GENERATE_TAGFILE = example.tag GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = example.cpp EXAMPLE_PATH = example_test.cpp QUIET = YES diff --git a/examples/example.tag b/examples/example.tag index c314897..d30de7b 100644 --- a/examples/example.tag +++ b/examples/example.tag @@ -1,2 +1,2 @@ ->Test: "class_Test.html" +>Test: "class_test.html" example a0 "()" diff --git a/examples/file.cfg b/examples/file.cfg index f0604e6..b62db7d 100644 --- a/examples/file.cfg +++ b/examples/file.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = file GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = file.h QUIET = YES diff --git a/examples/func.cfg b/examples/func.cfg index 3c85e6a..b558d0d 100644 --- a/examples/func.cfg +++ b/examples/func.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = func GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = func.h QUIET = YES diff --git a/examples/group.cfg b/examples/group.cfg index f9662f8..0cff98f 100644 --- a/examples/group.cfg +++ b/examples/group.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = group GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = group.cpp QUIET = YES diff --git a/examples/include.cfg b/examples/include.cfg index 9f27384..fbbd684 100644 --- a/examples/include.cfg +++ b/examples/include.cfg @@ -3,6 +3,7 @@ OUTPUT_DIRECTORY = include GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = include.cpp EXAMPLE_PATH = example_test.cpp QUIET = YES diff --git a/examples/jdstyle.cfg b/examples/jdstyle.cfg index f5c8bac..adcb2a4 100644 --- a/examples/jdstyle.cfg +++ b/examples/jdstyle.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = jdstyle GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = jdstyle.cpp QUIET = YES diff --git a/examples/memgrp.cfg b/examples/memgrp.cfg index 20fa462..6f613c5 100644 --- a/examples/memgrp.cfg +++ b/examples/memgrp.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = memgrp GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = memgrp.cpp QUIET = YES diff --git a/examples/overload.cfg b/examples/overload.cfg index e0ddd66..048f15d 100644 --- a/examples/overload.cfg +++ b/examples/overload.cfg @@ -3,5 +3,7 @@ OUTPUT_DIRECTORY = overload GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO +SORT_MEMBER_DOCS = NO INPUT = overload.cpp QUIET = YES diff --git a/examples/page.cfg b/examples/page.cfg index 27dcd49..4f1274e 100644 --- a/examples/page.cfg +++ b/examples/page.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = page GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = page.doc QUIET = YES diff --git a/examples/par.cfg b/examples/par.cfg index 08ebdc6..32e887f 100644 --- a/examples/par.cfg +++ b/examples/par.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = par GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = par.cpp QUIET = YES diff --git a/examples/qtstyle.cfg b/examples/qtstyle.cfg index 2760ba7..06318b8 100644 --- a/examples/qtstyle.cfg +++ b/examples/qtstyle.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = qtstyle GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = qtstyle.cpp QUIET = YES diff --git a/examples/relates.cfg b/examples/relates.cfg index 60dc8c9..822f45c 100644 --- a/examples/relates.cfg +++ b/examples/relates.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = relates GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = relates.cpp QUIET = YES diff --git a/examples/restypedef.cfg b/examples/restypedef.cfg index 613a727..bbd599f 100644 --- a/examples/restypedef.cfg +++ b/examples/restypedef.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = restypedef GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = restypedef.cpp QUIET = YES diff --git a/examples/structcmd.cfg b/examples/structcmd.cfg index b6803f5..5ba95c3 100644 --- a/examples/structcmd.cfg +++ b/examples/structcmd.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = structcmd GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = structcmd.h QUIET = YES diff --git a/examples/tag.cfg b/examples/tag.cfg index 2e338e4..277d0b1 100644 --- a/examples/tag.cfg +++ b/examples/tag.cfg @@ -3,6 +3,7 @@ OUTPUT_DIRECTORY = tag GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = tag.cpp TAGFILES = example.tag PERL_PATH = perl diff --git a/examples/templ.cfg b/examples/templ.cfg index 4f3e254..6a0e5d2 100644 --- a/examples/templ.cfg +++ b/examples/templ.cfg @@ -3,5 +3,6 @@ OUTPUT_DIRECTORY = template GENERATE_LATEX = NO GENERATE_MAN = NO GENERATE_RTF = NO +CASE_SENSE_NAMES = NO INPUT = templ.cpp QUIET = YES diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec index b0765cf..90eb561 100644 --- a/packages/rpm/doxygen.spec +++ b/packages/rpm/doxygen.spec @@ -1,5 +1,5 @@ Name: doxygen -Version: 1.1.5-20000716 +Version: 1.2.0 Summary: documentation system for C, C++ and IDL Release: 1 Source0: doxygen-%{version}.src.tar.gz diff --git a/src/classdef.cpp b/src/classdef.cpp index 9d66246..8fd8d92 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -779,9 +779,9 @@ void ClassDef::writeDocumentation(OutputList &ol) { ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); - ol.writeString("<font size=2><center>["); + ol.writeString("<center><font size=\"2\">["); ol.writeHtmlLink("graph_legend.html",theTranslator->trLegend()); - ol.writeString("]</center></font>"); + ol.writeString("]</font></center>"); ol.popGeneratorState(); } ol.popGeneratorState(); @@ -811,9 +811,9 @@ void ClassDef::writeDocumentation(OutputList &ol) { ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); - ol.writeString("<font size=2><center>["); + ol.writeString("<center><font size=\"2\">["); ol.writeHtmlLink("graph_legend.html",theTranslator->trLegend()); - ol.writeString("]</center></font>"); + ol.writeString("]</font></center>"); ol.popGeneratorState(); } ol.popGeneratorState(); @@ -1123,7 +1123,7 @@ void ClassDef::writeMemberList(OutputList &ol) while (mi) { MemberDef *md=mi->memberDef; - ClassDef *cd=md->memberClass(); + ClassDef *cd=md->getClassDef(); // compute the protection level for this member Protection protect=md->protection(); @@ -1301,7 +1301,7 @@ void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup) //ol.insertMemberAlign(); //printf("ClassName=`%s' inGroup=%d\n",name().data(),inGroup); - if (inGroup && md && md->memberClass()==this) return; + if (inGroup && md && md->getClassDef()==this) return; switch(compType) { @@ -1447,13 +1447,13 @@ void ClassDef::mergeMembers(/*ClassDef *cd,BaseClassList *bcl*/) bool hidden=FALSE; MemberNameInfoIterator dstMnii(*dstMni); MemberInfo *dstMi; - ClassDef *srcCd = srcMd->memberClass(); + ClassDef *srcCd = srcMd->getClassDef(); for ( ; (dstMi=dstMnii.current()) && !found; ++dstMnii ) { MemberDef *dstMd = dstMi->memberDef; if (srcMd!=dstMd) // different members { - ClassDef *dstCd = dstMd->memberClass(); + ClassDef *dstCd = dstMd->getClassDef(); //printf("Is %s a base class of %s?\n",srcCd->name(),dstCd->name()); if (srcCd==dstCd || dstCd->isBaseClass(srcCd)) // member is in the same or a base class @@ -1565,7 +1565,7 @@ void ClassDef::mergeMembers(/*ClassDef *cd,BaseClassList *bcl*/) Specifier virt=mi->virt; if (mi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt; MemberInfo *newMi=new MemberInfo(mi->memberDef,bcd->prot,virt); - //if (mi->memberDef->memberClass()!=bClass) + //if (mi->memberDef->getClassDef()!=bClass) newMi->scopePath=bClass->name()+"::"+mi->scopePath; newMi->ambigClass=mi->ambigClass; newMi->ambiguityResolutionScope=mi->ambiguityResolutionScope.copy(); diff --git a/src/classdef.h b/src/classdef.h index 9fde96d..a52173d 100644 --- a/src/classdef.h +++ b/src/classdef.h @@ -102,10 +102,12 @@ class ClassDef : public Definition ArgumentList *outerTemplateArguments() const; void setTemplateArguments(ArgumentList *al); //QCString getTemplateNameString(); + + NamespaceDef *getNamespaceDef() { return nspace; } + FileDef *getFileDef() const { return fileDef; } + void setNamespace(NamespaceDef *nd) { nspace = nd; } - NamespaceDef *getNamespace() { return nspace; } void setFileDef(FileDef *fd) { fileDef=fd; } - FileDef *getFileDef() const { return fileDef; } void mergeMembers(); bool isBaseClass(ClassDef *bcd); void determineImplUsageRelation(); @@ -96,6 +96,7 @@ static int g_lastStringContext; static int g_bracketCount = 0; static int g_curlyCount = 0; static int g_sharpCount = 0; +static bool g_insideTemplate = FALSE; static QCString g_type; static QCString g_name; static QCString g_args; @@ -254,6 +255,14 @@ static void setClassScope(const QCString &name) //printf("setClassScope(%s)\n",name.data()); QCString n=name; n=n.simplifyWhiteSpace(); + int ts=n.find('<'); // start of template + int te=n.findRev('>'); // end of template + //printf("ts=%d te=%d\n",ts,te); + if (ts!=-1 && te!=-1 && te>ts) + { + // remove template from scope + n=n.left(ts)+n.right(n.length()-te-1); + } int index; if ((index=n.findRev("::"))!=-1) g_classScope=n.left(index); @@ -273,7 +282,7 @@ static void addVariable() else { //printf("adding variable `%s' `%s'\n",g_cvd.type.data(),g_cvd.name.data()); - if ((getClass(g_cvd.type)) || (g_codeClassDict[g_cvd.type])) + if ((getResolvedClass(g_cvd.type)) || (g_codeClassDict[g_cvd.type])) { g_cvd.classScope=g_classScope; g_codeVarList.append(new CodeVarDef(g_cvd)); // add it to a list @@ -436,11 +445,11 @@ static bool generateClassMemberLink(OutputList &ol,ClassDef *mcd,const char *mem int mdist=maxInheritanceDepth; for (;(mmd=mmni.current());++mmni) { - int m=minClassDistance(mcd,mmd->memberClass()); - if (m<mdist && mmd->memberClass()->isLinkable()) + int m=minClassDistance(mcd,mmd->getClassDef()); + if (m<mdist && mmd->getClassDef()->isLinkable()) { mdist=m; - xcd=mmd->memberClass(); + xcd=mmd->getClassDef(); xmd=mmd; } } @@ -507,33 +516,36 @@ static void generateMemberLink(OutputList &ol,const char *varName, } else { + //printf("Class not found!\n"); OutputList result(&ol); + //printf("cvd->type=`%s'\n",cvd->type.data()); if (getLink(cvd->type,memName,result)) { ol+=result; } else { - codifyLines(memName); + codifyLines(memName); } return; } } else { - ClassDef *vcd = getClass(g_classScope); + ClassDef *vcd = getResolvedClass(g_classScope); if (vcd && vcd->isLinkable()) { //printf("Found class for variable `%s'\n",varName); MemberName *vmn=memberNameDict[varName]; if (vmn) { + //printf("There is a variable with name `%s'\n",varName); MemberNameIterator vmni(*vmn); MemberDef *vmd; for (;(vmd=vmni.current());++vmni) { if ((vmd->isVariable() || vmd->isFunction()) && - vmd->memberClass()==vcd) + vmd->getClassDef()==vcd) { //printf("Found variable type=%s\n",vmd->typeString()); ClassDef *mcd=stripClassName(vmd->typeString()); @@ -552,11 +564,11 @@ static void generateMemberLink(OutputList &ol,const char *varName, int mdist=maxInheritanceDepth; for (;(mmd=mmni.current());++mmni) { - int m=minClassDistance(mcd,mmd->memberClass()); - if (m<mdist && mmd->memberClass()->isLinkable()) + int m=minClassDistance(mcd,mmd->getClassDef()); + if (m<mdist && mmd->getClassDef()->isLinkable()) { mdist=m; - xcd=mmd->memberClass(); + xcd=mmd->getClassDef(); xmd=mmd; } } @@ -609,6 +621,14 @@ static void generateFunctionLink(OutputList &ol,char *funcName) { locScope=locFunc.left(i); locFunc=locFunc.right(locFunc.length()-i-2); + int ts=locScope.find('<'); // start of template + int te=locScope.findRev('>'); // end of template + //printf("ts=%d te=%d\n",ts,te); + if (ts!=-1 && te!=-1 && te>ts) + { + // remove template from scope + locScope=locScope.left(ts)+locScope.right(locScope.length()-te-1); + } } //printf("generateFunctionLink(%s) classScope=%s\n",locFunc.data(),locScope.data()); if (!locScope.isEmpty() && (ccd=g_codeClassDict[locScope])) @@ -684,7 +704,9 @@ B [ \t] BN [ \t\n\r] ID [a-z_A-Z][a-z_A-Z0-9]* SCOPENAME (({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID}) -SCOPEPREFIX {ID}{B}*"::"({B}*{ID}{B}*"::")* +TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">" +SCOPETNAME ((({ID}{TEMPLIST}?){BN}*"::"{BN}*)*)((~{BN}*)?{ID}) +SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*"::"{BN}*)+ KEYWORD ("asm"|"auto"|"class"|"const"|"const_cast"|"delete"|"dynamic_cast"|"enum"|"explicit"|"extern"|"false"|"friend"|"inline"|"mutable"|"namespace"|"new"|"operator"|"private"|"protected"|"public"|"register"|"reinterpret_cast"|"sizeof"|"static"|"static_cast"|"struct"|"template"|"this"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile") FLOWKW ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"for"|"goto"|"if"|"return"|"switch"|"throw"|"try"|"while") TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"|"void"|"wchar_t") @@ -720,7 +742,8 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" codifyLines(yytext); endFontClass(); //g_code->codify(yytext); - BEGIN( ClassName ); + if (!g_insideTemplate) + BEGIN( ClassName ); } <ReadInclude>[a-z_A-Z0-9.]+(("/"[a-z_A-Z0-9.]+)*)/(">"|"\"") { //FileInfo *f; @@ -753,7 +776,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" <SkipCPP>\\\n { codifyLines(yytext); } -<SkipCPP>\n { +<SkipCPP>\n/.*\n { codifyLines(yytext); endFontClass(); BEGIN( Body ) ; @@ -852,7 +875,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" } -<Body>{SCOPEPREFIX}*{B}*"operator"{B}*"()"{B}*/"(" { +<Body>{SCOPEPREFIX}?"operator"{B}*"()"{B}*/"(" { addType(); generateFunctionLink(*g_code,yytext); g_bracketCount=1; @@ -860,7 +883,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" g_name+=yytext; BEGIN( FuncCall ); } -<Body>{SCOPEPREFIX}*{B}*"operator"{B}*[^\(\n]+/"(" { +<Body>{SCOPEPREFIX}?"operator"{B}*[^\(\n]+/"(" { addType(); generateFunctionLink(*g_code,yytext); g_bracketCount=1; @@ -868,6 +891,13 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" g_name+=yytext; BEGIN( FuncCall ); } +<Body>"template"/([^a-zA-Z0-9]) { + startFontClass("keyword"); + codifyLines(yytext); + endFontClass(); + g_insideTemplate=TRUE; + g_sharpCount=0; + } <Body>{KEYWORD}/([^a-z_A-Z0-9]) { startFontClass("keyword"); codifyLines(yytext); @@ -918,13 +948,15 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" addType(); g_name+=yytext; } -<Body>{SCOPENAME}{B}*"<"[^\"\}\{\(\)\/\n\>]*">"/{B}* { + /* +<Body>{SCOPETNAME}/{B}* { int i; generateClassLink(*g_code,yytext,&i); addType(); QCString text=yytext; g_name+=text.left(i); } + */ <Body>{SCOPENAME}/{B}* { // p->func() generateClassLink(*g_code,yytext); addType(); @@ -944,7 +976,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" addType(); g_name+=varname; } -<Body>{SCOPENAME}/{B}*"(" { // func1()->func2() +<Body>{SCOPETNAME}/{B}*"(" { // a() or c::a() or t<A,B>::a() addType(); generateFunctionLink(*g_code,yytext); g_bracketCount=1; @@ -976,6 +1008,23 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" g_code->codify(yytext); g_name.resize(0);g_type.resize(0); } +<Body>"<" { + if (g_insideTemplate) + { + g_sharpCount++; + } + g_code->codify(yytext); + } +<Body>">" { + if (g_insideTemplate) + { + if (--g_sharpCount<=0) + { + g_insideTemplate=FALSE; + } + } + g_code->codify(yytext); + } <Body,MemberCall,MemberCall2,FuncCall>"'"((\\0[Xx0-9]+)|(\\.)|(.))"'" { startFontClass("charliteral"); g_code->codify(yytext); @@ -986,7 +1035,7 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" g_code->codify(yytext); BEGIN( MemberCall ); } -<MemberCall>{SCOPENAME}/{B}*"(" { +<MemberCall>{SCOPETNAME}/{B}*"(" { if (!g_name.isEmpty()) { generateMemberLink(*g_code,g_name,yytext); @@ -1273,7 +1322,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" } else { - g_lastCContext = YY_START ; + // check is to prevent getting stuck in skipping C++ comments + if (YY_START != SkipCxxComment) + { + g_lastCContext = YY_START ; + } startFontClass("comment"); g_code->codify(yytext); BEGIN(SkipComment); @@ -1336,7 +1389,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" } else { - g_lastCContext = YY_START ; + // check is to prevent getting stuck in skipping C++ comments + if (YY_START != SkipCxxComment) + { + g_lastCContext = YY_START ; + } startFontClass("comment"); g_code->codify(yytext); BEGIN(SkipComment); @@ -1350,7 +1407,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" } else { - g_lastCContext = YY_START ; + // check is to prevent getting stuck in skipping C++ comments + if (YY_START != SkipCxxComment) + { + g_lastCContext = YY_START ; + } startFontClass("comment"); g_code->codify(yytext); BEGIN(SkipComment); @@ -1366,7 +1427,11 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" <*>"/*" { startFontClass("comment"); g_code->codify(yytext); - g_lastCContext = YY_START ; + // check is to prevent getting stuck in skipping C++ comments + if (YY_START != SkipCxxComment) + { + g_lastCContext = YY_START ; + } BEGIN( SkipComment ) ; } <*>"//" { @@ -1430,6 +1495,7 @@ void parseCode(OutputList &ol,const char *className,const QCString &s, g_bodyCurlyCount = 0; g_bracketCount = 0; g_sharpCount = 0; + g_insideTemplate = FALSE; g_classVar = 0; g_classScope = className; g_exampleBlock = exBlock; diff --git a/src/definition.cpp b/src/definition.cpp index 22a5826..3ce5893 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -357,7 +357,7 @@ void Definition::writeSourceRefs(OutputList &ol,const char *scopeName) { QCString scope=md->getScopeString(); QCString name=md->name(); - //printf("class=%p scope=%s scopeName=%s\n",md->memberClass(),scope.data(),scopeName); + //printf("class=%p scope=%s scopeName=%s\n",md->getClassDef(),scope.data(),scopeName); if (!scope.isEmpty() && scope!=scopeName) { name.prepend(scope+"::"); diff --git a/src/dot.cpp b/src/dot.cpp index 37d06f1..02a0b07 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -1104,7 +1104,20 @@ void DotClassGraph::writeGraph(QTextStream &out, return; } out << "<p><center><img src=\"" << baseName << ".gif\" border=\"0\" usemap=\"#" - << m_startNode->m_label << "_" << mapName << "\"></center>" << endl; + << m_startNode->m_label << "_" << mapName << "\" alt=\""; + switch (m_graphType) + { + case Implementation: + out << "Collaboration graph"; + break; + case Interface: + out << "Interface dependency graph"; + break; + case Inheritance: + out << "Inheritance graph"; + break; + } + out << "\"></center>" << endl; out << "<map name=\"" << m_startNode->m_label << "_" << mapName << "\">" << endl; convertMapFile(out,baseName+".map"); out << "</map><p>" << endl; @@ -1140,7 +1153,7 @@ void DotClassGraph::writeGraph(QTextStream &out, "\\end{center}\n" "\\end{figure}\n"; } - //thisDir.remove(baseName+".dot"); + thisDir.remove(baseName+".dot"); QDir::setCurrent(oldDir); } @@ -1280,7 +1293,9 @@ void DotInclDepGraph::writeGraph(QTextStream &out, } out << "<p><center><img src=\"" << baseName << ".gif\" border=\"0\" usemap=\"#" - << mapName << "_map\">"; + << mapName << "_map\" alt=\""; + if (m_inverse) out << "Included by dependency graph"; else out << "Include dependency graph"; + out << "\">"; out << "</center>" << endl; out << "<map name=\"" << mapName << "_map\">" << endl; convertMapFile(out,baseName+".map"); diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 47d54dd..c756ba8 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -952,7 +952,7 @@ static MemberDef *addVariableToClass( MemberDef *md=mn->first(); while (md) { - if (md->memberClass()==cd && root->type==md->typeString()) + if (md->getClassDef()==cd && root->type==md->typeString()) // member already in the scope { addMemberDocs(root,md,def,0,FALSE); @@ -1085,7 +1085,7 @@ static MemberDef *addVariableToFile( { nd = namespaceDict[nscope]; } - if (nd==0 || md->getNamespace()==nd) + if (nd==0 || md->getNamespaceDef()==nd) // variable already in the scope { addMemberDocs(root,md,def,0,FALSE); @@ -1352,8 +1352,9 @@ static void buildMemberList(Entry *root) ); bool isFriend=root->type.find("friend ")!=-1; + QCString rname = removeRedundantWhiteSpace(root->name); - if (!root->name.isEmpty()) + if (!rname.isEmpty()) { ClassDef *cd=0; @@ -1365,18 +1366,18 @@ static void buildMemberList(Entry *root) QCString scope=stripAnnonymousNamespaceScope(root->parent->name.copy()); bool isMember=FALSE; - int memIndex=root->name.find("::"); + int memIndex=rname.find("::"); if (memIndex!=-1) { - int ts=root->name.find('<'); - int te=root->name.find('>'); + int ts=rname.find('<'); + int te=rname.find('>'); if (ts==-1 || te==-1) { isMember=TRUE; } else { - isMember=memIndex<ts && memIndex<te; + isMember=memIndex<ts || memIndex>te; } } @@ -1398,7 +1399,7 @@ static void buildMemberList(Entry *root) root->type=root->type.left(i+l); } - QCString name=removeRedundantWhiteSpace(root->name); + QCString name=removeRedundantWhiteSpace(rname); if (name.left(2)=="::") name=name.right(name.length()-2); MemberDef::MemberType mtype; @@ -1417,7 +1418,7 @@ static void buildMemberList(Entry *root) //if (Config::includeSourceFlag && !root->body.isEmpty()) //{ // printf("Function: %s\n-----------------\n%s\n------------------\n", - // root->name.data(),root->body.data()); + // rname.data(),root->body.data()); //} // new member function, signal or slot. @@ -1500,7 +1501,7 @@ static void buildMemberList(Entry *root) " def=`%s'\n", root->type.data(), root->parent->name.data(), - root->name.data(), + rname.data(), root->args.data(), root->proto, def.data() @@ -1532,7 +1533,7 @@ static void buildMemberList(Entry *root) !(root->parent->section & Entry::COMPOUND_MASK) && !isMember && - //root->name.find("::")==-1 && // TODO: remove this check + //rname.find("::")==-1 && // TODO: remove this check // // it breaks cases like // // func<A::B>(), but it is needed // // for detect that A::func() is a member @@ -1550,23 +1551,37 @@ static void buildMemberList(Entry *root) bool found=FALSE; MemberName *mn; //MemberDef *fmd; - if ((mn=functionNameDict[root->name])) + if ((mn=functionNameDict[rname])) { - //printf("--> function %s already found!\n",root->name.data()); + //printf("--> function %s already found!\n",rname.data()); MemberDef *md=mn->first(); while (md && !found) { - NamespaceDef *nd = md->getNamespace(); + NamespaceDef *nd = md->getNamespaceDef(); + NamespaceDef *rnd = 0; + if (!root->parent->name.isEmpty()) + { + rnd = namespaceDict[root->parent->name]; + } FileDef *fd = md->getFileDef(); - QCString nsName = nd ? nd->name().data() : ""; - //printf("namespace `%s'\n",nsName.data()); + QCString nsName,rnsName; + if (nd) nsName = nd->name().copy(); + if (rnd) rnsName = rnd->name().copy(); + //printf("namespace `%s' `%s'\n",nsName.data(),rnsName.data()); if ( matchArguments(md->argumentList(),root->argList,0,nsName) ) { - // function already found in the same file, one is probably - // a prototype. - found=nd || fd->absFilePath()==root->fileName; + // see if we need to create a new member + found=nsName==rnsName && // members are in the same namespace + ((fd!=0 && // no external reference + fd->absFilePath()==root->fileName // prototype in the same file + ) || + md->getGroupDef()!=0 // member is part of a group + ); + // otherwise, allow a duplicate global member with the same argument list + + // merge members documentation and properties mergeArguments(root->argList,md->argumentList()); if (!md->documentation() && !root->doc.isEmpty()) { @@ -1590,10 +1605,10 @@ static void buildMemberList(Entry *root) if (!found) /* global function is unique with respect to the file */ { //printf("New function type=`%s' name=`%s' args=`%s' bodyLine=%d\n", - // root->type.data(),root->name.data(),root->args.data(),root->bodyLine); + // root->type.data(),rname.data(),root->args.data(),root->bodyLine); // new global function - QCString name=removeRedundantWhiteSpace(root->name); + QCString name=removeRedundantWhiteSpace(rname); MemberDef *md=new MemberDef( root->fileName,root->startLine, root->type,name,root->args,root->exception, @@ -1641,7 +1656,7 @@ static void buildMemberList(Entry *root) " def=`%s'\n", root->type.data(), root->parent->name.data(), - root->name.data(), + rname.data(), root->args.data(), root->proto, def.data() @@ -1705,10 +1720,10 @@ static void buildMemberList(Entry *root) } //printf("unrelated function %d `%s' `%s' `%s'\n", - // root->parent->section,root->type.data(),root->name.data(),root->args.data()); + // root->parent->section,root->type.data(),rname.data(),root->args.data()); } } - else if (root->name.isEmpty()) + else if (rname.isEmpty()) { warn(root->fileName,root->startLine, "Warning: Illegal member name found." @@ -1748,11 +1763,11 @@ static void findFriends() //printf("Checking for matching arguments // mmd->isRelated()=%d mmd->isFriend()=%d mmd->isFunction()=%d\n", // mmd->isRelated(),mmd->isFriend(),mmd->isFunction()); - NamespaceDef *nd=mmd->getNamespace(); + NamespaceDef *nd=mmd->getNamespaceDef(); if ((mmd->isFriend() || (mmd->isRelated() && mmd->isFunction())) && matchArguments(mmd->argumentList(), fmd->argumentList(), - mmd->memberClass()->name(), + mmd->getClassDef()->name(), nd ? nd->name().data() : 0 ) ) // if the member is related and the arguments match then the @@ -1951,7 +1966,7 @@ static bool findBaseClassRelation(Entry *root,ClassDef *cd, } bool found=baseClass!=0 && baseClass!=cd; - NamespaceDef *nd=cd->getNamespace(); + NamespaceDef *nd=cd->getNamespaceDef(); if (!found) { FileDef *fd=cd->getFileDef(); @@ -2166,8 +2181,8 @@ static void addMemberDocs(Entry *root, // strip extern specifier if (fDecl.left(7)=="extern ") fDecl=fDecl.right(fDecl.length()-7); md->setDefinition(fDecl); - ClassDef *cd=md->memberClass(); - NamespaceDef *nd=md->getNamespace(); + ClassDef *cd=md->getClassDef(); + NamespaceDef *nd=md->getNamespaceDef(); if (al) { mergeArguments(md->argumentList(),al); @@ -2390,7 +2405,7 @@ static bool findUnrelatedFunction(Entry *root, while (md) { bool ambig; - NamespaceDef *nd=md->getNamespace(); + NamespaceDef *nd=md->getNamespaceDef(); //printf("Namespace namespaceName=%s nd=%s\n", // namespaceName.data(),nd ? nd->name().data() : "<none>"); FileDef *fd=findFileDef(inputNameDict,root->fileName,ambig); @@ -2897,7 +2912,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl { Debug::print(Debug::FindMembers,0, "3. member definition found scopeName=`%s'\n",scopeName.data()); - ClassDef *cd=md->memberClass(); + ClassDef *cd=md->getClassDef(); //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; @@ -3036,7 +3051,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl md=mn->first(); while (md) { - ClassDef *cd=md->memberClass(); + ClassDef *cd=md->getClassDef(); if (cd!=0 && cd->name()==className) candidates++; md=mn->next(); } @@ -3047,7 +3062,7 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl md=mn->first(); while (md) { - ClassDef *cd=md->memberClass(); + ClassDef *cd=md->getClassDef(); if (cd!=0 && cd->name()==className) { warn_cont(" %s",md->declaration()); @@ -3075,14 +3090,14 @@ static void findMember(Entry *root,QCString funcDecl,QCString related,bool overl // however be avoided, because it is error prone MemberDef *md=mn->first(); ASSERT(md); - ClassDef *cd=md->memberClass(); + ClassDef *cd=md->getClassDef(); ASSERT(cd); QCString className=cd->name().copy(); md=mn->next(); bool unique=TRUE; while (md) { - ClassDef *cd=md->memberClass(); + ClassDef *cd=md->getClassDef(); if (className!=cd->name()) unique=FALSE; md=mn->next(); } @@ -3519,7 +3534,7 @@ static void findEnums(Entry *root) { if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') { - NamespaceDef *fnd=fmd->getNamespace(); + NamespaceDef *fnd=fmd->getNamespaceDef(); if (fnd==nd) // enum value is inside a namespace { md->insertEnumField(fmd); @@ -3537,7 +3552,7 @@ static void findEnums(Entry *root) } else { - ClassDef *fcd=fmd->memberClass(); + ClassDef *fcd=fmd->getClassDef(); if (fcd==cd) // enum value is inside a class { md->insertEnumField(fmd); // add field def to list @@ -3605,7 +3620,7 @@ static void findEnumDocumentation(Entry *root) MemberDef *md=mn->first(); while (md && !found) { - ClassDef *cd=md->memberClass(); + ClassDef *cd=md->getClassDef(); if (cd && cd->name()==className) { // documentation outside a compound overrides the documentation inside it @@ -3729,8 +3744,8 @@ static void computeMemberRelations() for ( ; bmdi.current() ; ++bmdi) // for each other member with that signature { MemberDef *bmd=bmdi.current(); - ClassDef *bmcd = bmd->memberClass(); - ClassDef *mcd = md->memberClass(); + ClassDef *bmcd = bmd->getClassDef(); + ClassDef *mcd = md->getClassDef(); //printf("Check relation between `%s'::`%s' and `%s'::`%s'\n", // mcd->name().data(),md->name().data(), // bmcd->name().data(),bmd->name().data() @@ -3750,7 +3765,7 @@ static void computeMemberRelations() { MemberDef *rmd; if ((rmd=md->reimplements())==0 || - minClassDistance(mcd,bmcd)<minClassDistance(mcd,rmd->memberClass()) + minClassDistance(mcd,bmcd)<minClassDistance(mcd,rmd->getClassDef()) ) { //printf("setting (new) reimplements member\n"); @@ -3905,13 +3920,13 @@ static void addSourceReferences() MemberDef *md=0; for (mni.toFirst();(md=mni.current());++mni) { - ClassDef *cd=md->memberClass(); + ClassDef *cd=md->getClassDef(); FileDef *fd=md->getBodyDef(); if (fd && cd && cd->isLinkableInProject() && md->getStartBodyLine()!=-1 && md->isLinkableInProject()) { Definition *d=cd; - if (d==0) d=md->getNamespace(); + if (d==0) d=md->getNamespaceDef(); if (d==0) d=md->getFileDef(); fd->addSourceRef(md->getStartBodyLine(),d,md); } @@ -3924,9 +3939,9 @@ static void addSourceReferences() MemberDef *md=0; for (mni.toFirst();(md=mni.current());++mni) { - NamespaceDef *nd=md->getNamespace(); + NamespaceDef *nd=md->getNamespaceDef(); FileDef *fd=md->getBodyDef(); - GroupDef *gd=md->groupDef(); + GroupDef *gd=md->getGroupDef(); if (md->getStartBodyLine()!=-1 && md->isLinkableInProject() && ((nd && nd->isLinkableInProject()) || (fd && fd->isLinkableInProject()) || @@ -4641,22 +4656,17 @@ static void generateSearchIndex() //---------------------------------------------------------------------------- -/*! Generate a template version of the configuration file. - * If the \a shortList parameter is TRUE a configuration file without - * comments will be generated. - */ -static void generateConfigFile(const char *configFile,bool shortList) +static bool openOutputFile(const char *outFile,QFile &f) { - QFile f; bool fileOpened=FALSE; - bool writeToStdout=(configFile[0]=='-' && configFile[1]==0); + bool writeToStdout=(outFile[0]=='-' && outFile[1]=='\0'); if (writeToStdout) // write to stdout { fileOpened = f.open(IO_WriteOnly,stdout); } else // write to file { - QFileInfo fi(configFile); + QFileInfo fi(outFile); if (fi.exists()) // create a backup { QDir dir=fi.dir(); @@ -4665,14 +4675,24 @@ static void generateConfigFile(const char *configFile,bool shortList) dir.remove(backup.fileName()); dir.rename(fi.fileName(),fi.fileName()+".bak"); } - f.setName(configFile); + f.setName(outFile); fileOpened = f.open(IO_WriteOnly); } - + return fileOpened; +} + +/*! Generate a template version of the configuration file. + * If the \a shortList parameter is TRUE a configuration file without + * comments will be generated. + */ +static void generateConfigFile(const char *configFile,bool shortList) +{ + QFile f; + bool fileOpened=openOutputFile(configFile,f); + bool writeToStdout=(configFile[0]=='-' && configFile[1]=='\0'); if (fileOpened) { writeTemplateConfig(&f,shortList); - f.close(); if (!writeToStdout) { msg("\n\nConfiguration file `%s' created.\n\n",configFile); @@ -4692,60 +4712,6 @@ static void generateConfigFile(const char *configFile,bool shortList) } //---------------------------------------------------------------------------- - -/*! Generate a template stylesheet - */ -static void generateStyleSheetFile(OutputGenerator::OutputType outType,const char *sheetName) -{ - QFile f; - bool fileOpened=FALSE; - bool writeToStdout = strcmp(sheetName,"-")==0; - if (writeToStdout) // write to stdout - { - fileOpened = f.open(IO_WriteOnly,stdout); - } - else // write to file - { - QFileInfo fi(sheetName); - if (fi.exists()) // create a backup - { - QDir dir=fi.dir(); - QFileInfo backup(fi.fileName()+".bak"); - if (backup.exists()) // remove existing backup - dir.remove(backup.fileName()); - dir.rename(fi.fileName(),fi.fileName()+".bak"); - } - f.setName(sheetName); - fileOpened = f.open(IO_WriteOnly); - } - - if (fileOpened) - { - switch(outType) - { - case OutputGenerator::RTF: - RTFGenerator::writeStyleSheetFile(f); - break; - case OutputGenerator::Html: - HtmlGenerator::writeStyleSheetFile(f); - break; - case OutputGenerator::Latex: - LatexGenerator::writeStyleSheetFile(f); - break; - default: - break; - } - f.close(); - } - else - { - err("Error: Cannot open file %s for writing\n",sheetName); - exit(1); - } -} - - -//---------------------------------------------------------------------------- // read and parse a tag file //static bool readLineFromFile(QFile &f,QCString &s) @@ -5189,8 +5155,9 @@ static void usage(const char *name) msg(" %s [configName]\n\n",name); msg(" If - is used for configName doxygen will read from standard input.\n\n"); msg("4) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.\n"); - msg(" %s -w rtf|html|latex outputFileName [configName]\n",name); - msg(" If - is used for outputFileName doxygen will write to standard output.\n\n"); + msg(" RTF: %s -w rtf styleSheetFile\n",name); + msg(" HTML: %s -w html headerFile footerFile styleSheetFile [configFile]\n",name); + msg(" LaTeX: %s -w latex headerFile styleSheetFile [configFile]\n\n",name); msg("If -s is specified the comments in the config file will be omitted.\n"); msg("If configName is omitted `Doxyfile' will be used as a default.\n\n"); exit(1); @@ -5261,28 +5228,65 @@ int main(int argc,char **argv) err("Error: option -w is missing format specifier rtf, html or latex\n"); exit(1); } - if (optind+1>=argc) - { - err("Error: option -w is missing a configuration file name\n"); - exit(1); - } if (stricmp(formatName,"rtf")==0) { - generateStyleSheetFile(OutputGenerator::RTF,argv[optind+1]); + if (optind+1>=argc) + { + err("Error: option \"-w rtf\" is missing a style sheet file name\n"); + exit(1); + } + QFile f; + if (openOutputFile(argv[optind+1],f)) + { + RTFGenerator::writeStyleSheetFile(f); + } exit(1); } else if (stricmp(formatName,"html")==0) { - generateStyleSheetFile(OutputGenerator::Html,argv[optind+1]); + if (optind+4<argc) + { + QCString configFile=fileToString(argv[optind+4]); + if (configFile.isEmpty()) exit(1); + parseConfig(fileToString(argv[optind+4])); + configStrToVal(); + substituteEnvironmentVars(); + checkConfig(); + } + else + { + Config::init(); + setTranslator("English"); + } + if (optind+3>=argc) + { + err("Error: option \"-w html\" does not have enough arguments\n"); + exit(1); + } + QFile f; + if (openOutputFile(argv[optind+1],f)) + { + HtmlGenerator::writeHeaderFile(f); + } + f.close(); + if (openOutputFile(argv[optind+2],f)) + { + HtmlGenerator::writeFooterFile(f); + } + f.close(); + if (openOutputFile(argv[optind+3],f)) + { + HtmlGenerator::writeStyleSheetFile(f); + } exit(1); } else if (stricmp(formatName,"latex")==0) { - if (optind+2<argc) // use config file to get settings + if (optind+3<argc) // use config file to get settings { - QCString configFile=fileToString(argv[optind+2]); + QCString configFile=fileToString(argv[optind+3]); if (configFile.isEmpty()) exit(1); - parseConfig(fileToString(argv[optind+2])); + parseConfig(fileToString(argv[optind+3])); configStrToVal(); substituteEnvironmentVars(); checkConfig(); @@ -5292,7 +5296,21 @@ int main(int argc,char **argv) Config::init(); setTranslator("English"); } - generateStyleSheetFile(OutputGenerator::Latex,argv[optind+1]); + if (optind+2>=argc) + { + err("Error: option \"-w html\" does not have enough arguments\n"); + exit(1); + } + QFile f; + if (openOutputFile(argv[optind+1],f)) + { + LatexGenerator::writeHeaderFile(f); + } + f.close(); + if (openOutputFile(argv[optind+2],f)) + { + LatexGenerator::writeStyleSheetFile(f); + } exit(1); } else @@ -5356,7 +5374,7 @@ int main(int argc,char **argv) else { QFileInfo fi(argv[optind]); - if (fi.exists()) + if (fi.exists() || strcmp(argv[optind],"-")==0) { config=fileToString(argv[optind]); configName=argv[optind]; @@ -5765,8 +5783,7 @@ int main(int argc,char **argv) msg("Combining RTF output...\n"); if (!RTFGenerator::preProcessFileInplace(Config::rtfOutputDir,"refman.rtf")) { - err("Error processing RTF files!\n"); - exit(1); + err("An error occurred during post-processing the RTF files!\n"); } } diff --git a/src/filedef.cpp b/src/filedef.cpp index ac174f3..eefb1ad 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -508,25 +508,46 @@ void FileDef::insertMember(MemberDef *md) switch(md->memberType()) { case MemberDef::Variable: - varMembers.inSort(md); + if (Config::sortMembersFlag) + varMembers.inSort(md); + else + varMembers.append(md); break; - case MemberDef::Function: - funcMembers.inSort(md); + case MemberDef::Function: + if (Config::sortMembersFlag) + funcMembers.inSort(md); + else + funcMembers.append(md); break; case MemberDef::Typedef: - typedefMembers.inSort(md); + if (Config::sortMembersFlag) + typedefMembers.inSort(md); + else + typedefMembers.append(md); break; case MemberDef::Enumeration: - enumMembers.inSort(md); + if (Config::sortMembersFlag) + enumMembers.inSort(md); + else + enumMembers.append(md); break; case MemberDef::EnumValue: - enumValMembers.inSort(md); + if (Config::sortMembersFlag) + enumValMembers.inSort(md); + else + enumValMembers.append(md); break; case MemberDef::Prototype: - protoMembers.inSort(md); + if (Config::sortMembersFlag) + protoMembers.inSort(md); + else + protoMembers.append(md); break; case MemberDef::Define: - defineMembers.inSort(md); + if (Config::sortMembersFlag) + defineMembers.inSort(md); + else + defineMembers.append(md); break; default: err("FileDef::insertMembers(): unexpected member insert in file!\n"); @@ -537,7 +558,10 @@ void FileDef::insertMember(MemberDef *md) /*! Adds compound definition \a cd to the list of all compounds of this file */ void FileDef::insertClass(ClassDef *cd) { - classList->inSort(cd); + if (Config::sortMembersFlag) + classList->inSort(cd); + else + classList->append(cd); } /*! Adds namespace definition \a nd to the list of all compounds of this file */ @@ -545,7 +569,10 @@ void FileDef::insertNamespace(NamespaceDef *nd) { if (!nd->name().isEmpty() && namespaceDict->find(nd->name())==0) { - namespaceList->inSort(nd); + if (Config::sortMembersFlag) + namespaceList->inSort(nd); + else + namespaceList->append(nd); namespaceDict->insert(nd->name(),nd); } } diff --git a/src/groupdef.cpp b/src/groupdef.cpp index 7857cc9..72529d0 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -78,17 +78,26 @@ void GroupDef::distributeMemberGroupDocumentation() void GroupDef::addFile(const FileDef *def) { - fileList->append(def); + if (Config::sortMembersFlag) + fileList->inSort(def); + else + fileList->append(def); } void GroupDef::addClass(const ClassDef *def) { - classList->append(def); + if (Config::sortMembersFlag) + classList->inSort(def); + else + classList->append(def); } void GroupDef::addNamespace(const NamespaceDef *def) { - namespaceList->append(def); + if (Config::sortMembersFlag) + namespaceList->inSort(def); + else + namespaceList->append(def); } void GroupDef::addMemberListToGroup(MemberList *ml, @@ -142,15 +151,50 @@ void GroupDef::insertMember(MemberDef *md) allMemberDict->insert(funcDecl,md); switch(md->memberType()) { - case MemberDef::Variable: varMembers.inSort(md); break; - case MemberDef::Function: funcMembers.inSort(md); break; - case MemberDef::Typedef: typedefMembers.inSort(md); break; - case MemberDef::Enumeration: enumMembers.inSort(md); break; - case MemberDef::EnumValue: enumValMembers.inSort(md); break; - case MemberDef::Prototype: protoMembers.inSort(md); break; - case MemberDef::Define: defineMembers.inSort(md); break; + case MemberDef::Variable: + if (Config::sortMembersFlag) + varMembers.inSort(md); + else + varMembers.append(md); + break; + case MemberDef::Function: + if (Config::sortMembersFlag) + funcMembers.inSort(md); + else + funcMembers.append(md); + break; + case MemberDef::Typedef: + if (Config::sortMembersFlag) + typedefMembers.inSort(md); + else + typedefMembers.append(md); + break; + case MemberDef::Enumeration: + if (Config::sortMembersFlag) + enumMembers.inSort(md); + else + enumMembers.append(md); + break; + case MemberDef::EnumValue: + if (Config::sortMembersFlag) + enumValMembers.inSort(md); + else + enumValMembers.append(md); + break; + case MemberDef::Prototype: + if (Config::sortMembersFlag) + protoMembers.inSort(md); + else + protoMembers.append(md); + break; + case MemberDef::Define: + if (Config::sortMembersFlag) + defineMembers.inSort(md); + else + defineMembers.append(md); + break; default: - err("FileDef::insertMembers(): unexpected member insert in file!\n"); + err("FileDef::insertMembers(): unexpected member insert in file!\n"); } //addMemberToGroup(md,groupId); } @@ -158,7 +202,10 @@ void GroupDef::insertMember(MemberDef *md) void GroupDef::addGroup(const GroupDef *def) { - groupList->append(def); + if (Config::sortMembersFlag) + groupList->inSort(def); + else + groupList->append(def); } int GroupDef::countMembers() const @@ -450,7 +497,7 @@ void addMemberToGroups(Entry *root,MemberDef *md) GroupDef *gd=0; if (!s->isEmpty() && (gd=groupDict[*s])) { - GroupDef *mgd = md->groupDef(); + GroupDef *mgd = md->getGroupDef(); if (mgd==0) { gd->insertMember(md); diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index 89e9b2c..913ec2f 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -45,7 +45,7 @@ static const char *defaultStyleSheet = "A.codeRef { font-weight: normal; color: #4444ee }\n" "DL.el { margin-left: -1cm }\n" "DIV.fragment { width: 100%; border: none; background-color: #eeeeee }\n" - "DIV.in { margin-left: 16 }\n" + //"DIV.in { margin-left: 16 }\n" "DIV.ah { background-color: black; margin-bottom: 3; margin-top: 3 }\n" "TD.md { background-color: #f2f2ff }\n" "DIV.groupHeader { margin-left: 16; margin-top: 12; margin-bottom: 6; font-weight: bold }\n" @@ -96,6 +96,61 @@ void HtmlGenerator::writeStyleSheetFile(QFile &file) QTextStream t(&file); t << defaultStyleSheet; } + +static void writeDefaultHeaderFile(QTextStream &t,const char *title, + bool external) +{ + t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n" + "<html><head><meta name=\"robots\" content=\"noindex\">\n" + "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=" + << theTranslator->idLanguageCharset() << "\">\n" + "<title>" << title << "</title>\n"; + t << "<link "; + if (external) + t << "doxygen=\"_doc:" << Config::docURL + << "\" href=\"" << Config::docURL << "/"; + else + t << "href=\""; + if (Config::htmlStyleSheet.isEmpty()) + { + t << "doxygen.css"; + } + else + { + QFileInfo cssfi(Config::htmlStyleSheet); + if (!cssfi.exists()) + { + err("Error: user specified HTML style sheet file does not exist!\n"); + } + t << cssfi.fileName(); + } + t << "\" rel=\"stylesheet\" type=\"text/css\">\n" + "</head><body bgcolor=\"#ffffff\">\n"; +} + + +void HtmlGenerator::writeHeaderFile(QFile &file) +{ + QTextStream t(&file); + writeDefaultHeaderFile(t,"$title",FALSE); +} + +void HtmlGenerator::writeFooterFile(QFile &file) +{ + QTextStream t(&file); + t << "<hr><address><small>\n"; + t << "Generated at $datetime for $projectname "; + t << " by <a href=\"http://www.stack.nl/~dimitri/doxygen/index.html\">\n" + << "<img src=\"doxygen.gif\" alt=\"doxygen\" " + << "align=\"middle\" border=0 width=110 height=53>\n" + << "</a> $doxygenversion written by" + << " <a href=\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>,\n" + << " © 1997-2000</small></address>\n" + << "</body>\n" + << "</html>\n"; +} + + void HtmlGenerator::startFile(const char *name,const char *title,bool external) { QCString fileName=name; @@ -105,28 +160,7 @@ void HtmlGenerator::startFile(const char *name,const char *title,bool external) lastFile = fileName; if (header.isEmpty()) { - t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n" - "<html><head><meta name=\"robots\" content=\"noindex\">\n" - "<meta http-equiv=\"Content-Type\" content=\"text/html;charset=" - << theTranslator->idLanguageCharset() << "\">\n" - "<title>" << title << "</title>\n"; - t << "<link "; - if (external) - t << "doxygen=\"_doc:" << Config::docURL - << "\" href=\"" << Config::docURL << "/"; - else - t << "href=\""; - if (Config::htmlStyleSheet.isEmpty()) - { - t << "doxygen.css"; - } - else - { - QFileInfo cssfi(Config::htmlStyleSheet); - t << cssfi.fileName(); - } - t << "\" rel=\"stylesheet\" type=\"text/css\">\n" - "</head><body bgcolor=\"#ffffff\">\n"; + writeDefaultHeaderFile(t,title,external); } else { @@ -190,13 +224,13 @@ void HtmlGenerator::writeFooter(int part,bool external) t << "src=\""; } t << "doxygen.gif\" alt=\"doxygen\" " - << "align=center border=0 " << endl << + << "align=\"middle\" border=0 " << endl << "width=110 height=53></a>" << versionString <<" "; } break; default: if (footer.isEmpty()) - t << " <a href=\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>,\n © " + t << " <a href=\"mailto:dimitri@stack.nl\">Dimitri van Heesch</a>,\n © " "1997-2000</small></address>\n</body>\n</html>\n"; break; @@ -561,7 +595,15 @@ void HtmlGenerator::endColorFont() void HtmlGenerator::writeFormula(const char *n,const char *text) { if (text && text[0]=='\\') t << "<p><center>" << endl; - t << "<img align=\"top\" src=\"" << n << "\">" << endl; + t << "<img align="; +#if !defined(_WIN32) + t << "\"top\""; // assume Unix users use Netscape 4.x which does + // not seem to support align == "middle" :-(( +#else + t << "\"middle\""; // assume Windows users use IE or HtmlHelp which only + // displays formulas nicely with align == "middle" +#endif + t << " src=\"" << n << "\">" << endl; if (text && text[0]=='\\') t << "</center><p>" << endl; } @@ -899,7 +941,13 @@ void HtmlGenerator::endMemberGroup(bool) void HtmlGenerator::startIndent() { + // I really wanted to use CSS here to provide an indented section, but + // alas, Netscape is buggy enough to sometimes "forget" to end the + // indent cause a staircase effect where the indent continuously increases. + // It's back to abusing tables :-( + //t << "<div class=\"in\">" << endl; + t << "<table cellspacing=5 cellpadding=0 border=0>\n" " <tr>\n" " <td>\n" diff --git a/src/htmlgen.h b/src/htmlgen.h index cda2982..780c7d7 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -31,6 +31,8 @@ class HtmlGenerator : public OutputGenerator ~HtmlGenerator(); static void init(); static void writeStyleSheetFile(QFile &f); + static void writeHeaderFile(QFile &f); + static void writeFooterFile(QFile &f); OutputGenerator *copy() { return new HtmlGenerator; } //OutputGenerator *clone() { return new HtmlGenerator(*this); } diff --git a/src/index.cpp b/src/index.cpp index 3a76956..9e13091 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -947,7 +947,7 @@ void writeMemberList(OutputList &ol) //!md->isReference() && md->hasDocumentation() && // md->name()[0]!='@' && md->isLinkableInProject() && - (cd=md->memberClass()) && + (cd=md->getClassDef()) && cd->isLinkableInProject() ) { @@ -968,7 +968,7 @@ void writeMemberList(OutputList &ol) QCString prevName; while (md) { - ClassDef *cd=md->memberClass(); + ClassDef *cd=md->getClassDef(); if (//cd && (md->isFriend() || md->protection()!=Private || Config::extractPrivateFlag) && //!md->isReference() && md->hasDocumentation() && md->isLinkableInProject() && @@ -1009,10 +1009,10 @@ int countClassMembers() { if (//(md->isFriend() || md->protection()!=Private || Config::extractPrivateFlag) && //!md->isReference() && !md->isRelated() && md->hasDocumentation() && - //md->name()[0]!='@' && (cd=md->memberClass()) && cd->isLinkable()) + //md->name()[0]!='@' && (cd=md->getClassDef()) && cd->isLinkable()) md->isLinkableInProject() && !md->isRelated() && - (cd=md->memberClass()) && + (cd=md->getClassDef()) && cd->isLinkableInProject() ) { @@ -1025,10 +1025,10 @@ int countClassMembers() // otherMd=md; //if (//(md->isFriend() || md->protection()!=Private || Config::extractPrivateFlag) && // //!md->isReference() && md->isRelated() && md->hasDocumentation() && - // //md->name()[0]!='@' && (cd=md->memberClass()) && cd->isLinkable() + // //md->name()[0]!='@' && (cd=md->getClassDef()) && cd->isLinkable() // md->isLinkableInProject() && // md->isRelated() && - // (cd=md->memberClass()) && + // (cd=md->getClassDef()) && // cd->isLinkableInProject() // ) // found=TRUE; @@ -1073,10 +1073,9 @@ void writeFileMemberList(OutputList &ol) bool found=FALSE; while (md && !found) { - FileDef *fd=md->getFileDef() ? md->getFileDef() : md->getFileDec(); - bool hasDocs = - (md->getFileDef() && md->getFileDef()->isLinkableInProject()) || - (md->getFileDec() && md->getFileDec()->isLinkableInProject()); + FileDef *fd=md->getFileDef(); + bool hasDocs = md->getFileDef() && + md->getFileDef()->isLinkableInProject(); if (fd && hasDocs && md->isLinkableInProject() @@ -1099,10 +1098,9 @@ void writeFileMemberList(OutputList &ol) QCString prevName; while (md) { - FileDef *fd=md->getFileDef() ? md->getFileDef() : md->getFileDec(); - bool hasDocs = - (md->getFileDef() && md->getFileDef()->isLinkableInProject()) || - (md->getFileDec() && md->getFileDec()->isLinkableInProject()); + FileDef *fd=md->getFileDef(); + bool hasDocs = md->getFileDef() && + md->getFileDef()->isLinkableInProject(); if (fd && hasDocs && md->isLinkableInProject() && //!md->isReference() && @@ -1143,7 +1141,7 @@ void writeNamespaceMemberList(OutputList &ol) bool found=FALSE; while (md && !found) { - NamespaceDef *nd=md->getNamespace(); + NamespaceDef *nd=md->getNamespaceDef(); if (nd && nd->isLinkableInProject() && md->isLinkableInProject()) found=TRUE; else @@ -1161,7 +1159,7 @@ void writeNamespaceMemberList(OutputList &ol) QCString prevName; while (md) { - NamespaceDef *nd=md->getNamespace(); + NamespaceDef *nd=md->getNamespaceDef(); if (nd && nd->isLinkableInProject() && md->isLinkableInProject() && prevName!=nd->name() ) @@ -1195,7 +1193,7 @@ int countNamespaceMembers() bool found=FALSE; while (md && !found) { - NamespaceDef *nd=md->getNamespace(); + NamespaceDef *nd=md->getNamespaceDef(); if (nd && nd->isLinkableInProject() && md->isLinkableInProject()) found=TRUE; else @@ -1220,11 +1218,9 @@ int countFileMembers() bool found=FALSE; while (md && !found) { - if (md->isLinkableInProject() && - (((fd=md->getFileDef()) && fd->isLinkableInProject()) - || - ((fd=md->getFileDec()) && fd->isLinkableInProject()) - ) + if (md->isLinkableInProject() && + (fd=md->getFileDef()) && + fd->isLinkableInProject() ) found=TRUE; else @@ -1243,8 +1239,6 @@ void writeFileMemberIndex(OutputList &ol) if (documentedFunctions==0) return; ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); - //ol.disable(OutputGenerator::Man); - //ol.disable(OutputGenerator::Latex); startFile(ol,"globals","File Member Index"); startTitle(ol,0); parseText(ol,Config::projectName+" "+theTranslator->trFileMembers()); @@ -1252,8 +1246,6 @@ void writeFileMemberIndex(OutputList &ol) parseText(ol,theTranslator->trFileMembersDescription(Config::extractAllFlag)); writeFileMemberList(ol); endFile(ol); - //ol.enable(OutputGenerator::Latex); - //ol.enable(OutputGenerator::Man); ol.popGeneratorState(); } diff --git a/src/language.cpp b/src/language.cpp index 08704d3..186edae 100644 --- a/src/language.cpp +++ b/src/language.cpp @@ -30,6 +30,7 @@ #include "translator_ru.h" #include "translator_hr.h" #include "translator_pl.h" +#include "translator_pt.h" #endif #define L_EQUAL(a) !stricmp(langName,a) @@ -95,6 +96,10 @@ bool setTranslator(const char *langName) { theTranslator=new TranslatorPolish; } + else if (L_EQUAL("portuguese")) + { + theTranslator=new TranslatorPortuguese; + } #endif else // use the default language (i.e. english) { diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 1a19618..1f2e1a2 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -96,6 +96,7 @@ LatexGenerator::LatexGenerator() : OutputGenerator() col=0; //printf("LatexGenerator::LatexGenerator() insideTabbing=FALSE\n"); insideTabbing=FALSE; + firstDescItem=TRUE; } LatexGenerator::~LatexGenerator() @@ -113,6 +114,7 @@ void LatexGenerator::append(const OutputGenerator *g) t << g->getContents(); col+=((LatexGenerator *)g)->col; insideTabbing=insideTabbing || ((LatexGenerator *)g)->insideTabbing; + firstDescItem = ((LatexGenerator *)g)->firstDescItem; //printf("LatexGenerator::append(%s) insideTabbing=%s\n", g->getContents().data(), // insideTabbing ? "TRUE" : "FALSE" ); } @@ -175,7 +177,7 @@ void LatexGenerator::init() << "\trm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out" << endl; } -static void writeDefaultsStyleSheetPart1(QTextStream &t) +static void writeDefaultHeaderPart1(QTextStream &t) { // part 1 @@ -252,7 +254,7 @@ static void writeDefaultsStyleSheetPart1(QTextStream &t) } -static void writeDefaultsStyleSheetPart2(QTextStream &t) +static void writeDefaultHeaderPart2(QTextStream &t) { // part 2 t << "}\\\\" << endl @@ -260,7 +262,7 @@ static void writeDefaultsStyleSheetPart2(QTextStream &t) << "{\\large "; } -static void writeDefaultsStyleSheetPart3(QTextStream &t) +static void writeDefaultHeaderPart3(QTextStream &t) { // part 3 t << " Doxygen " << versionString << "}\\\\" << endl @@ -275,16 +277,112 @@ static void writeDefaultsStyleSheetPart3(QTextStream &t) t << "\\pagenumbering{arabic}\n"; } -void LatexGenerator::writeStyleSheetFile(QFile &f) +static void writeDefaultStyleSheetPart1(QTextStream &t) +{ + // part 1 + t << "\\NeedsTeXFormat{LaTeX2e}\n"; + t << "\\ProvidesPackage{doxygen}\n"; + t << "\\RequirePackage{calc}\n"; + t << "\\RequirePackage{array}\n"; + t << "\\pagestyle{fancyplain}\n"; + t << "\\addtolength{\\headwidth}{\\marginparsep}\n"; + t << "\\addtolength{\\headwidth}{\\marginparwidth}\n"; + t << "\\newcommand{\\clearemptydoublepage}{\\newpage{\\pagestyle{empty}"; + t << "\\cleardoublepage}}\n"; + if (!Config::compactLatexFlag) + t << "\\renewcommand{\\chaptermark}[1]{\\markboth{#1}{}}\n"; + t << "\\renewcommand{\\sectionmark}[1]{\\markright{\\thesection\\ #1}}\n"; + t << "\\lhead[\\fancyplain{}{\\bfseries\\thepage}]\n"; + t << " {\\fancyplain{}{\\bfseries\\rightmark}}\n"; + t << "\\rhead[\\fancyplain{}{\\bfseries\\leftmark}]\n"; + t << " {\\fancyplain{}{\\bfseries\\thepage}}\n"; + t << "\\rfoot[\\fancyplain{}{\\bfseries\\scriptsize "; +} + +static void writeDefaultStyleSheetPart2(QTextStream &t) +{ + t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize "; +} + +static void writeDefaultStyleSheetPart3(QTextStream &t) +{ + t << "}}\n"; + t << "\\cfoot{}\n"; + t << "\\newenvironment{CompactList}\n"; + t << "{\\begin{list}{}{\n"; + t << " \\setlength{\\leftmargin}{0.5cm}\n"; + t << " \\setlength{\\itemsep}{0pt}\n"; + t << " \\setlength{\\parsep}{0pt}\n"; + t << " \\setlength{\\topsep}{0pt}\n"; + t << " \\renewcommand{\\makelabel}{}}}\n"; + t << "{\\end{list}}\n"; + t << "\\newenvironment{CompactItemize}\n"; + t << "{\n"; + t << " \\begin{itemize}\n"; + t << " \\setlength{\\itemsep}{-3pt}\n"; + t << " \\setlength{\\parsep}{0pt}\n"; + t << " \\setlength{\\topsep}{0pt}\n"; + t << " \\setlength{\\partopsep}{0pt}\n"; + t << "}\n"; + t << "{\\end{itemize}}\n"; + t << "\\newcommand{\\PBS}[1]{\\let\\temp=\\\\#1\\let\\\\=\\temp}\n"; + t << "\\newlength{\\tmplength}\n"; + t << "\\newenvironment{TabularC}[1]\n"; + t << "{\n"; + t << "\\setlength{\\tmplength}\n"; + t << " {\\linewidth/(#1)-\\tabcolsep*2-\\arrayrulewidth*(#1+1)/(#1)}\n"; + t << " \\par\\begin{tabular*}{\\linewidth}\n"; + t << " {*{#1}{|>{\\PBS\\raggedright\\hspace{0pt}}p{\\the\\tmplength}}|}\n"; + t << "}\n"; + t << "{\\end{tabular*}\\par}\n"; + t << "\\newcommand{\\entrylabel}[1]{\n"; + t << " {\\parbox[b]{\\labelwidth-4pt}{\\makebox[0pt][l]{\\textbf{#1}}\\\\}}}\n"; + t << "\\newenvironment{Desc}\n"; + t << "{\\begin{list}{}\n"; + t << " {\n"; + t << " \\settowidth{\\labelwidth}{40pt}\n"; + t << " \\setlength{\\leftmargin}{\\labelwidth}\n"; + t << " \\setlength{\\parsep}{0pt}\n"; + t << " \\setlength{\\itemsep}{-4pt}\n"; + t << " \\renewcommand{\\makelabel}{\\entrylabel}\n"; + t << " }\n"; + t << "}\n"; + t << "{\\end{list}}\n"; + + t << "\\newenvironment{Indent}\n"; + t << " {\\begin{list}{}{\\setlength{\\leftmargin}{0.5cm}}\n"; + t << " \\item[]\\ignorespaces}\n"; + t << " {\\unskip\\end{list}}\n"; + + t << "\\setlength{\\parindent}{0cm}\n"; + t << "\\setlength{\\parskip}{0.2cm}\n"; + t << "\\addtocounter{secnumdepth}{1}\n"; + t << "\\sloppy\n"; +} + +void LatexGenerator::writeHeaderFile(QFile &f) { QTextStream t(&f); - writeDefaultsStyleSheetPart1(t); + writeDefaultHeaderPart1(t); t << "Your title here"; - writeDefaultsStyleSheetPart2(t); + writeDefaultHeaderPart2(t); t << "Generated by"; - writeDefaultsStyleSheetPart3(t); + writeDefaultHeaderPart3(t); } +void LatexGenerator::writeStyleSheetFile(QFile &f) +{ + QTextStream t(&f); + writeDefaultStyleSheetPart1(t); + t << "Generated at " << dateToString(TRUE); + if (Config::projectName.isEmpty()) t << " for " << Config::projectName << " "; + t << "by doxygen written by Dimitri van Heesch \\copyright{} 1997-2000"; + writeDefaultStyleSheetPart2(t); + t << "Generated at " << dateToString(TRUE); + if (Config::projectName.isEmpty()) t << " for " << Config::projectName << " "; + t << "by doxygen written by Dimitri van Heesch \\copyright{} 1997-2000"; + writeDefaultStyleSheetPart3(t); +} void LatexGenerator::startFile(const char *name,const char *,bool) { @@ -316,7 +414,7 @@ void LatexGenerator::startIndexSection(IndexSections is) { if (Config::latexHeaderFile.isEmpty()) { - writeDefaultsStyleSheetPart1(t); + writeDefaultHeaderPart1(t); } else { @@ -328,7 +426,7 @@ void LatexGenerator::startIndexSection(IndexSections is) case isTitlePageAuthor: if (Config::latexHeaderFile.isEmpty()) { - writeDefaultsStyleSheetPart2(t); + writeDefaultHeaderPart2(t); } break; case isMainPage: @@ -365,7 +463,7 @@ void LatexGenerator::startIndexSection(IndexSections is) bool found=FALSE; while (gd && !found) { - if (gd->isLinkableInProject() || gd->countMembers()>0) + if (gd->countMembers()>0) { if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter"; t << "{"; //Module Documentation}\n"; @@ -381,7 +479,7 @@ void LatexGenerator::startIndexSection(IndexSections is) bool found=FALSE; while (nd && !found) { - if (nd->isLinkableInProject()) + if (nd->isLinkableInProject() && nd->countMembers()>0) { if (Config::compactLatexFlag) t << "\\section"; else t << "\\chapter"; t << "{"; // Namespace Documentation}\n": @@ -458,7 +556,7 @@ void LatexGenerator::endIndexSection(IndexSections is) case isTitlePageAuthor: if (Config::latexHeaderFile.isEmpty()) { - writeDefaultsStyleSheetPart3(t); + writeDefaultHeaderPart3(t); } break; case isMainPage: @@ -512,7 +610,7 @@ void LatexGenerator::endIndexSection(IndexSections is) bool found=FALSE; while (nd && !found) { - if (nd->isLinkableInProject() || nd->countMembers()>0) + if (nd->isLinkableInProject() && nd->countMembers()>0) { t << "}\n\\input{" << nd->getOutputFileBase() << "}\n"; found=TRUE; @@ -521,7 +619,7 @@ void LatexGenerator::endIndexSection(IndexSections is) } while (nd) { - if (nd->isLinkableInProject() || nd->countMembers()>0) + if (nd->isLinkableInProject() && nd->countMembers()>0) { if (Config::compactLatexFlag) t << "\\input"; else t << "\\include"; t << "{" << nd->getOutputFileBase() << "}\n"; @@ -640,23 +738,7 @@ void LatexGenerator::writeStyleInfo(int part) { //QCString pname=Config::projectName.stripWhiteSpace(); startPlainFile("doxygen.sty"); - t << "\\NeedsTeXFormat{LaTeX2e}\n"; - t << "\\ProvidesPackage{doxygen}\n"; - t << "\\RequirePackage{calc}\n"; - t << "\\RequirePackage{array}\n"; - t << "\\pagestyle{fancyplain}\n"; - t << "\\addtolength{\\headwidth}{\\marginparsep}\n"; - t << "\\addtolength{\\headwidth}{\\marginparwidth}\n"; - t << "\\newcommand{\\clearemptydoublepage}{\\newpage{\\pagestyle{empty}"; - t << "\\cleardoublepage}}\n"; - if (!Config::compactLatexFlag) - t << "\\renewcommand{\\chaptermark}[1]{\\markboth{#1}{}}\n"; - t << "\\renewcommand{\\sectionmark}[1]{\\markright{\\thesection\\ #1}}\n"; - t << "\\lhead[\\fancyplain{}{\\bfseries\\thepage}]\n"; - t << " {\\fancyplain{}{\\bfseries\\rightmark}}\n"; - t << "\\rhead[\\fancyplain{}{\\bfseries\\leftmark}]\n"; - t << " {\\fancyplain{}{\\bfseries\\thepage}}\n"; - t << "\\rfoot[\\fancyplain{}{\\bfseries\\scriptsize "; + writeDefaultStyleSheetPart1(t); } break; case 1: @@ -665,83 +747,15 @@ void LatexGenerator::writeStyleInfo(int part) break; case 2: { - t << " Dimitri van Heesch \\copyright{} 1997-2000}]{}\n"; - //QCString dtString=dateToString(FALSE); - t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize "; + t << " Dimitri van Heesch \\copyright{} 1997-2000"; + t << "}]{}\n"; + writeDefaultStyleSheetPart2(t); } break; case 4: { - t << " Dimitri van Heesch \\copyright{} 1997-2000}}\n"; - t << "\\cfoot{}\n"; - t << "\\newenvironment{CompactList}\n"; - t << "{\\begin{list}{}{\n"; - t << " \\setlength{\\leftmargin}{0.5cm}\n"; - t << " \\setlength{\\itemsep}{0pt}\n"; - t << " \\setlength{\\parsep}{0pt}\n"; - t << " \\setlength{\\topsep}{0pt}\n"; - t << " \\renewcommand{\\makelabel}{}}}\n"; - t << "{\\end{list}}\n"; - t << "\\newenvironment{CompactItemize}\n"; - t << "{\n"; - t << " \\begin{itemize}\n"; - t << " \\setlength{\\itemsep}{-3pt}\n"; - t << " \\setlength{\\parsep}{0pt}\n"; - t << " \\setlength{\\topsep}{0pt}\n"; - t << " \\setlength{\\partopsep}{0pt}\n"; - t << "}\n"; - t << "{\\end{itemize}}\n"; - t << "\\newcommand{\\PBS}[1]{\\let\\temp=\\\\#1\\let\\\\=\\temp}\n"; - t << "\\newlength{\\tmplength}\n"; - t << "\\newenvironment{TabularC}[1]\n"; - t << "{\n"; - t << "\\setlength{\\tmplength}\n"; - t << " {\\linewidth/(#1)-\\tabcolsep*2-\\arrayrulewidth*(#1+1)/(#1)}\n"; - t << " \\par\\begin{tabular*}{\\linewidth}\n"; - t << " {*{#1}{|>{\\PBS\\raggedright\\hspace{0pt}}p{\\the\\tmplength}}|}\n"; - t << "}\n"; - t << "{\\end{tabular*}\\par}\n"; - t << "\\newcommand{\\entrylabel}[1]{\n"; - t << " {\\parbox[b]{\\labelwidth-4pt}{\\makebox[0pt][l]{\\textbf{#1}}\\\\}}}\n"; - t << "\\newenvironment{Desc}\n"; - t << "{\\begin{list}{}\n"; - t << " {\n"; - t << " \\settowidth{\\labelwidth}{40pt}\n"; - t << " \\setlength{\\leftmargin}{\\labelwidth}\n"; - t << " \\setlength{\\parsep}{0pt}\n"; - t << " \\setlength{\\itemsep}{-4pt}\n"; - t << " \\renewcommand{\\makelabel}{\\entrylabel}\n"; - t << " }\n"; - t << "}\n"; - t << "{\\end{list}}\n"; - - t << "\\newenvironment{Indent}\n"; - t << " {\\begin{list}{}{\\setlength{\\leftmargin}{0.5cm}}\n"; - t << " \\item[]\\ignorespaces}\n"; - t << " {\\unskip\\end{list}}\n"; - - t << "\\setlength{\\parindent}{0cm}\n"; - t << "\\setlength{\\parskip}{0.2cm}\n"; - t << "\\addtocounter{secnumdepth}{1}\n"; - //if (!Config::compactLatexFlag) - //{ - // t << "\\renewcommand{\\subsection}{\\@startsection{subsection}{2}{\\z@}\n"; - // t << " {-3.25ex \\@plus -1ex \\@minus -.2ex}\n"; - // t << " {1.5ex \\@plus.2ex}\n"; - // t << " {\\normalfont\\large\\bfseries\\medskip\n"; - // t << " \\vspace{0.6cm}\\hrule\\vspace{-0.6cm}}\n"; - // t << " }\n"; - //} - //else - //{ - // t << "\\renewcommand{\\subsubsection}{\\@startsection{subsubsection}{3}{\\z@}\n"; - // t << " {-3.25ex \\@plus -1ex \\@minus -.2ex}\n"; - // t << " {1.5ex \\@plus.2ex}\n"; - // t << " {\\normalfont\\normalsize\\bfseries\\medskip\n"; - // t << " \\vspace{0.6cm}\\hrule\\vspace{-0.6cm}}\n"; - // t << " }\n"; - //} - t << "\\sloppy\n"; + t << " Dimitri van Heesch \\copyright{} 1997-2000"; + writeDefaultStyleSheetPart3(t); endPlainFile(); } break; @@ -1435,4 +1449,33 @@ void LatexGenerator::endInclDepGraph(DotInclDepGraph &g) g.writeGraph(t,EPS,Config::latexOutputDir); } +void LatexGenerator::startDescription() +{ + t << "\\begin{description}" << endl; +} + +void LatexGenerator::endDescription() +{ + t << "\\end{description}" << endl; + firstDescItem=TRUE; +} + +void LatexGenerator::startDescItem() +{ + firstDescItem=TRUE; + t << "\\item["; +} + +void LatexGenerator::endDescItem() +{ + if (firstDescItem) + { + t << "]" << endl; + firstDescItem=FALSE; + } + else + { + lineBreak(); + } +} diff --git a/src/latexgen.h b/src/latexgen.h index 63af7f5..cb0ab81 100644 --- a/src/latexgen.h +++ b/src/latexgen.h @@ -29,6 +29,7 @@ class LatexGenerator : public OutputGenerator ~LatexGenerator(); static void init(); static void writeStyleSheetFile(QFile &f); + static void writeHeaderFile(QFile &f); OutputGenerator *copy(); //OutputGenerator *clone() { return new LatexGenerator(*this); } @@ -117,10 +118,10 @@ class LatexGenerator : public OutputGenerator void endEmphasis() { t << "}"; } void startBold() { t << "{\\bf "; } void endBold() { t << "}"; } - void startDescription() { t << "\\begin{description}" << endl; } - void endDescription() { t << "\\end{description}" << endl; } - void startDescItem() { t << "\\item["; } - void endDescItem() { t << "]" << endl; } + void startDescription(); + void endDescription(); + void startDescItem(); + void endDescItem(); void lineBreak() { t << "\\par\n"; } void startMemberDoc(const char *,const char *,const char *,const char *); void endMemberDoc(); @@ -236,6 +237,7 @@ class LatexGenerator : public OutputGenerator LatexGenerator &operator=(const LatexGenerator &); int col; bool insideTabbing; + bool firstDescItem; }; #endif diff --git a/src/memberdef.cpp b/src/memberdef.cpp index 6311c8a..396692a 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -236,7 +236,7 @@ MemberDef::MemberDef(const char *df,int dl, //printf("++++++ MemberDef(%s file=%s,line=%d) ++++++ \n",na,df,dl); classDef=0; fileDef=0; - fileDec=0; + //fileDec=0; redefines=0; redefinedBy=0; nspace=0; @@ -392,10 +392,10 @@ QCString MemberDef::getOutputFileBase() const { return fileDef->getOutputFileBase(); } - else if (fileDec) - { - return fileDec->getOutputFileBase(); - } + //else if (fileDec) + //{ + // return fileDec->getOutputFileBase(); + //} else if (nspace) { return nspace->getOutputFileBase(); @@ -703,10 +703,10 @@ void MemberDef::writeDeclaration(OutputList &ol, { //printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor()); annMemb->writeLink(ol, - annMemb->memberClass(), - annMemb->getNamespace(), + annMemb->getClassDef(), + annMemb->getNamespaceDef(), annMemb->getFileDef(), - annMemb->groupDef() + annMemb->getGroupDef() ); annMemb->annUsed=annUsed=TRUE; } @@ -794,7 +794,7 @@ void MemberDef::writeDeclaration(OutputList &ol, void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, const char *scopeName) { - if (memberClass()==0 && isStatic() && !Config::extractStaticFlag) return; + if (getClassDef()==0 && isStatic() && !Config::extractStaticFlag) return; bool hasDocs = detailsAreVisible(); //printf("MemberDef::writeDocumentation(): type=`%s' def=`%s'\n",type.data(),definition()); if ( @@ -806,8 +806,8 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, ) { // get definition. TODO: make a method of this - NamespaceDef *nd=getNamespace(); - ClassDef *cd=memberClass(); + NamespaceDef *nd=getNamespaceDef(); + ClassDef *cd=getClassDef(); FileDef *fd=getFileDef(); Definition *d = 0; if (cd) d=cd; else if (nd) d=nd; else d=fd; @@ -1160,7 +1160,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, MemberDef *bmd=reimplements(); ClassDef *bcd=0; - if (bmd && (bcd=bmd->memberClass())) + if (bmd && (bcd=bmd->getClassDef())) { #if 0 if (lvirt!=Normal) // search for virtual member of the deepest base class @@ -1168,7 +1168,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, MemberDef *lastBmd=bmd; while (lastBmd) { - ClassDef *lastBcd = lastBmd->memberClass(); + ClassDef *lastBcd = lastBmd->getClassDef(); if (lastBmd->virtualness()!=Normal && lastBmd->isLinkable() && lastBcd->isLinkable() @@ -1227,7 +1227,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, MemberDef *bmd=0; uint count=0; ClassDef *bcd=0; - for (mli.toFirst();(bmd=mli.current()) && (bcd=bmd->memberClass());++mli) + for (mli.toFirst();(bmd=mli.current()) && (bcd=bmd->getClassDef());++mli) { // count the members that directly inherit from md and for // which the member and class are visible in the docs. @@ -1253,7 +1253,7 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, count=0; // find the entryIndex-th documented entry in the inheritance list. - for (mli.toLast();(bmd=mli.current()) && (bcd=bmd->memberClass());--mli) + for (mli.toLast();(bmd=mli.current()) && (bcd=bmd->getClassDef());--mli) { if ( bmd->isLinkable() && bcd->isLinkable()) { @@ -1310,10 +1310,10 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, void MemberDef::warnIfUndocumented() { if (memberGroup) return; - ClassDef *cd = memberClass(); - NamespaceDef *nd = getNamespace(); + ClassDef *cd = getClassDef(); + NamespaceDef *nd = getNamespaceDef(); FileDef *fd = getFileDef(); - GroupDef *gd = groupDef(); + GroupDef *gd = getGroupDef(); Definition *d=0; const char *t=0; if (cd) @@ -1348,7 +1348,7 @@ bool MemberDef::isLinkable() bool MemberDef::detailsAreVisible() const { return !documentation().isEmpty() || // has detailed docs - /*(Config::sourceBrowseFlag && startBodyLine!=-1 && bodyDef) || // has reference to sources */ + (Config::sourceBrowseFlag && startBodyLine!=-1 && bodyDef) || // has reference to sources (mtype==Enumeration && docEnumValues) || // has enum values (mtype==EnumValue && !briefDescription().isEmpty()) || // is doc enum value (!briefDescription().isEmpty() && @@ -1385,7 +1385,7 @@ bool MemberDef::visibleMemberGroup(bool hideNoHeader) QCString MemberDef::getScopeString() const { QCString result; - if (memberClass()) result=memberClass()->name(); - else if (getNamespace()) result=getNamespace()->name(); + if (getClassDef()) result=getClassDef()->name(); + else if (getNamespaceDef()) result=getNamespaceDef()->name(); return result; } diff --git a/src/memberdef.h b/src/memberdef.h index d827eb0..c8cab13 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -72,6 +72,71 @@ class MemberDef : public Definition const ArgumentList *al); ~MemberDef(); + QCString getOutputFileBase() const; + const char *declaration() const { return decl; } + const char *definition() const { return def; } + const char *typeString() const { return type; } + const char *argsString() const { return args; } + const char *excpString() const { return exception; } + const char *anchor() const { return anc; } + const QCString &initializer() const { return init; } + int initializerLines() const { return initLines; } + int getMemberSpecifiers() const { return memSpec; } + MemberList *getSectionList() const { return section; } + + // scope query members + ClassDef *getClassDef() const { return classDef; } + GroupDef *getGroupDef() const { return group; } + FileDef *getFileDef() const { return fileDef; } + NamespaceDef* getNamespaceDef() const { return nspace; } + + // direct kind info + Protection protection() const { return prot; } + Specifier virtualness() const { return virt; } + MemberType memberType() const { return mtype; } + + // convenience methods + bool isSignal() const { return mtype==Signal; } + bool isSlot() const { return mtype==Slot; } + bool isVariable() const { return mtype==Variable; } + bool isEnumerate() const { return mtype==Enumeration; } + bool isEnumValue() const { return mtype==EnumValue; } + bool isTypedef() const { return mtype==Typedef; } + bool isFunction() const { return mtype==Function; } + bool isDefine() const { return mtype==Define; } + bool isFriend() const { return mtype==Friend; } + bool isRelated() const { return related; } + bool isStatic() const { return stat; } + bool isInline() const { return (memSpec&Entry::Inline)!=0; } + bool isExplicit() const { return (memSpec&Entry::Explicit)!=0; } + bool isMutable() const { return (memSpec&Entry::Mutable)!=0; } + + // output info + bool isLinkableInProject(); + bool isLinkable(); + bool detailsAreVisible() const; + bool hasDocumentation(); // overrides hasDocumentation in definition.h + + // set functions + void setMemberType(MemberType t) { mtype=t; } + void setDefinition(const char *d) { def=d; } + void setFileDef(FileDef *fd) { fileDef=fd; } + void setAnchor(const char *a) { anc=a; } + void setProtection(Protection p) { prot=p; } + void setMemberSpecifiers(int s) { memSpec=s; } + void mergeMemberSpecifiers(int s) { memSpec|=s; } + void setInitializer(const char *i) { init=i; + init=init.stripWhiteSpace(); + initLines=init.contains('\n'); + } + void setMaxInitLines(int lines) { if (lines!=-1) maxInitLines=lines; } + void setMemberClass(ClassDef *cd) { classDef=cd; } + void setSectionList(MemberList *sl) { section=sl; } + void setGroupDef(GroupDef *gd) { group=gd; } + + void makeRelated() { related=TRUE; } + + // output generatation void writeLink(OutputList &ol, ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd); void writeDeclaration(OutputList &ol, @@ -81,56 +146,11 @@ class MemberDef : public Definition const char *scopeName/*,MemberType m*/); void warnIfUndocumented(); - QCString getOutputFileBase() const; - const char *declaration() const { return decl; } - const char *definition() const { return def; } - const char *typeString() const { return type; } - const char *argsString() const { return args; } - const char *excpString() const { return exception; } - const char *anchor() const { return anc; } - const QCString &initializer() const { return init; } - int initializerLines() const { return initLines; } - ClassDef *memberClass() const { return classDef; } - Protection protection() const { return prot; } - Specifier virtualness() const { return virt; } - MemberType memberType() const { return mtype; } - GroupDef *groupDef() const { return group; } - FileDef *getFileDef() { return fileDef; } - FileDef *getFileDec() { return fileDec; } - bool isRelated() const { return related; } - bool isStatic() const { return stat; } - bool isInline() const { return (memSpec&Entry::Inline)!=0; } - bool isExplicit() const { return (memSpec&Entry::Explicit)!=0; } - bool isMutable() const { return (memSpec&Entry::Mutable)!=0; } - MemberList *getSectionList() const { return section; } - void setMemberType(MemberType t) { mtype=t; } - void setDefinition(const char *d) { def=d; } - void setFileDef(FileDef *fd) { fileDef=fd; } - void setFileDec(FileDef *fd) { fileDec=fd; } - void setAnchor(const char *a) { anc=a; } - void setProtection(Protection p) { prot=p; } - void setMemberSpecifiers(int s) { memSpec=s; } - int getMemberSpecifiers() const { return memSpec; } - void mergeMemberSpecifiers(int s) { memSpec|=s; } - void setInitializer(const char *i) { init=i; - init=init.stripWhiteSpace(); - initLines=init.contains('\n'); - } - void setMaxInitLines(int lines) { if (lines!=-1) maxInitLines=lines; } - void setMemberClass(ClassDef *cd) { classDef=cd; } - void setSectionList(MemberList *sl) { section=sl; } - void makeRelated() { related=TRUE; } - void setGroupDef(GroupDef *gd) { group=gd; } - bool hasDocumentation(); // overrides hasDocumentation in definition.h - bool isLinkableInProject(); - bool isLinkable(); - - bool detailsAreVisible() const; // relation to other members - void setReimplements(MemberDef *md) { redefines=md; } + void setReimplements(MemberDef *md) { redefines=md; } void insertReimplementedBy(MemberDef *md); - MemberDef *reimplements() const { return redefines; } - MemberList *reimplementedBy() const { return redefinedBy; } + MemberDef *reimplements() const { return redefines; } + MemberList *reimplementedBy() const { return redefinedBy; } // enumeration specific members void insertEnumField(MemberDef *md); @@ -148,20 +168,9 @@ class MemberDef : public Definition // example related members bool addExample(const char *anchor,const char *name,const char *file); - //void writeExample(OutputList &ol); bool hasExamples(); ExampleList *getExampleList() const { return exampleList; } - // convenience members - bool isSignal() const { return mtype==Signal; } - bool isSlot() const { return mtype==Slot; } - bool isVariable() const { return mtype==Variable; } - bool isEnumerate() const { return mtype==Enumeration; } - bool isEnumValue() const { return mtype==EnumValue; } - bool isTypedef() const { return mtype==Typedef; } - bool isFunction() const { return mtype==Function; } - bool isDefine() const { return mtype==Define; } - bool isFriend() const { return mtype==Friend; } // prototype related members void setPrototype(bool p) { proto=p; } @@ -178,10 +187,8 @@ class MemberDef : public Definition ArgumentList *scopeDefTemplateArguments() const { return scopeTAL; } void setMemberDefTemplateArguments(ArgumentList *t); ArgumentList *memberDefTemplateArguments() const { return membTAL; } - //QCString getScopeTemplateNameString(); // namespace related members - NamespaceDef *getNamespace() const { return nspace; } void setNamespace(NamespaceDef *nd) { nspace=nd; } // member group related members @@ -190,6 +197,7 @@ class MemberDef : public Definition void setMemberGroupId(int id) { grpId=id; } int getMemberGroupId() const { return grpId; } + // annonymous scope members void setFromAnnonymousScope(bool b) { annScope=b; } void setFromAnnonymousMember(MemberDef *m) { annMemb=m; } bool fromAnnonymousScope() const { return annScope; } @@ -204,7 +212,6 @@ class MemberDef : public Definition private: ClassDef *classDef; // member of or related to FileDef *fileDef; // member of file definition - FileDef *fileDec; // member of file declaration MemberDef *redefines; // the member that is redefined by this one MemberDef *enumScope; // the enclosing scope, if this is an enum field MemberDef *annEnumType; // the annonymous enum that is the type of this member @@ -225,8 +232,6 @@ class MemberDef : public Definition QCString declFile; // file where the declaration was found int declLine; // line where the declaration was found QCString def; // member definition in code (fully qualified name) - //QCString defFile; // file where the definition was found - //int defLine; // line where the definition was found QCString anc; // HTML anchor name Specifier virt; // normal/virtual/pure virtual Protection prot; // protection type [Public/Protected/Private] @@ -237,10 +242,10 @@ class MemberDef : public Definition bool eUsed; // is the enumerate already placed in a list bool proto; // is it a prototype; bool docEnumValues; // is an enum with documented enum values. - bool annScope; - bool annUsed; - bool annShown; - int indDepth; + bool annScope; // member is part of an annoymous scope + bool annUsed; + bool annShown; + int indDepth; // indentation depth for this member if inside an annonymous scope int maxInitLines; // when the initializer will be displayed MemberList *section; // declation list containing this member MemberDef *annMemb; @@ -249,7 +254,6 @@ class MemberDef : public Definition ArgumentList *scopeTAL; // template argument list of class template ArgumentList *membTAL; // template argument list of class template int grpId; // group id - //QCString grpHeader; // group header MemberGroup *memberGroup; // group's member definition GroupDef *group; // group in which this member is in diff --git a/src/memberlist.cpp b/src/memberlist.cpp index e49b0ef..2ec52f1 100644 --- a/src/memberlist.cpp +++ b/src/memberlist.cpp @@ -54,7 +54,7 @@ void MemberList::countDecMembers(bool inGroup,bool countSubGroups,bool sectionPe { //printf("md=%p md->name()=`%s' inGroup=%d getMemberGroup()=%p\n", // md,md->name().data(),inGroup,md->getMemberGroup()); - if (!(md->memberClass()==0 && md->isStatic() && !Config::extractStaticFlag) && + if (!(md->getClassDef()==0 && md->isStatic() && !Config::extractStaticFlag) && (!Config::hideMemberFlag || md->hasDocumentation()) && ( (!Config::hideMemberFlag || !md->documentation().isEmpty() || @@ -73,7 +73,7 @@ void MemberList::countDecMembers(bool inGroup,bool countSubGroups,bool sectionPe case MemberDef::Variable: varCnt++,m_count++; break; case MemberDef::Function: // fall through case MemberDef::Signal: // fall through - case MemberDef::Slot: if (!md->isRelated() || md->memberClass()) + case MemberDef::Slot: if (!md->isRelated() || md->getClassDef()) funcCnt++,m_count++; break; case MemberDef::Enumeration: enumCnt++,m_count++; break; @@ -119,7 +119,7 @@ void MemberList::countDocMembers() //printf("%s MemberList::countDocMembers() details=%d\n", // md->name().data(),md->detailsAreVisible()); bool visibleIfStatic = - !(md->memberClass()==0 && md->isStatic() && !Config::extractStaticFlag); + !(md->getClassDef()==0 && md->isStatic() && !Config::extractStaticFlag); if (visibleIfStatic && (Config::extractAllFlag || md->detailsAreVisible()) @@ -410,7 +410,7 @@ void MemberList::writePlainDeclarations(OutputList &ol, { if ( ( md->isFunction() || md->isSignal() || md->isSlot()) && - ( !md->isRelated() || md->memberClass() ) && + ( !md->isRelated() || md->getClassDef() ) && inGroup==md->visibleMemberGroup(sectionPerType) ) { diff --git a/src/membername.cpp b/src/membername.cpp index e62e629..3c3a3d0 100644 --- a/src/membername.cpp +++ b/src/membername.cpp @@ -33,8 +33,8 @@ int MemberName::compareItems(GCI item1, GCI item2) { MemberDef *m1=(MemberDef *)item1; MemberDef *m2=(MemberDef *)item2; - ClassDef *c1=m1->memberClass(); - ClassDef *c2=m2->memberClass(); + ClassDef *c1=m1->getClassDef(); + ClassDef *c2=m2->getClassDef(); FileDef *f1=m1->getFileDef(); FileDef *f2=m2->getFileDef(); if (c1 && c2) @@ -55,8 +55,8 @@ int MemberNameInfo::compareItems(GCI item1, GCI item2) { MemberInfo *m1=(MemberInfo *)item1; MemberInfo *m2=(MemberInfo *)item2; - ClassDef *c1=m1->memberDef->memberClass(); - ClassDef *c2=m2->memberDef->memberClass(); + ClassDef *c1=m1->memberDef->getClassDef(); + ClassDef *c2=m2->memberDef->getClassDef(); FileDef *f1=m1->memberDef->getFileDef(); FileDef *f2=m2->memberDef->getFileDef(); if (c1 && c2) diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index 366e49b..54aa1e6 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -66,14 +66,23 @@ void NamespaceDef::distributeMemberGroupDocumentation() } void NamespaceDef::insertUsedFile(const char *f) { - if (files.find(f)==-1) files.append(f); + if (files.find(f)==-1) + { + if (Config::sortMembersFlag) + files.inSort(f); + else + files.append(f); + } } void NamespaceDef::insertClass(ClassDef *cd) { if (classDict->find(cd->name())==0) { - classList->append(cd); + if (Config::sortMembersFlag) + classList->inSort(cd); + else + classList->append(cd); classDict->insert(cd->name(),cd); } } @@ -121,13 +130,48 @@ void NamespaceDef::insertMember(MemberDef *md) allMemberList.append(md); switch(md->memberType()) { - case MemberDef::Variable: varMembers.inSort(md); break; - case MemberDef::Function: funcMembers.inSort(md); break; - case MemberDef::Typedef: typedefMembers.inSort(md); break; - case MemberDef::Enumeration: enumMembers.inSort(md); break; - case MemberDef::EnumValue: enumValMembers.inSort(md); break; - case MemberDef::Prototype: protoMembers.inSort(md); break; - case MemberDef::Define: defineMembers.inSort(md); break; + case MemberDef::Variable: + if (Config::sortMembersFlag) + varMembers.inSort(md); + else + varMembers.append(md); + break; + case MemberDef::Function: + if (Config::sortMembersFlag) + funcMembers.inSort(md); + else + funcMembers.append(md); + break; + case MemberDef::Typedef: + if (Config::sortMembersFlag) + typedefMembers.inSort(md); + else + typedefMembers.append(md); + break; + case MemberDef::Enumeration: + if (Config::sortMembersFlag) + enumMembers.inSort(md); + else + enumMembers.append(md); + break; + case MemberDef::EnumValue: + if (Config::sortMembersFlag) + enumValMembers.inSort(md); + else + enumValMembers.append(md); + break; + case MemberDef::Prototype: + if (Config::sortMembersFlag) + protoMembers.inSort(md); + else + protoMembers.append(md); + break; + case MemberDef::Define: + if (Config::sortMembersFlag) + defineMembers.inSort(md); + else + defineMembers.append(md); + break; default: err("NamespaceDef::insertMembers(): unexpected member inserted in namespace!\n"); } @@ -51,8 +51,6 @@ #define YY_NEVER_INTERACTIVE 1 -#define DUMP_OUTPUT 1 // set this to one to see what the preprocessor - // produces. #define SHOW_INCLUDES 0 // set this to one to list all parsed include files struct FileState @@ -590,10 +588,10 @@ static void expandExpression(QCString &expr,QCString *rest,int pos) if (g_expandedDict->find(macroName)==0) // expand macro { Define *def=isDefined(macroName); - //printf("name is not an expanded macro def=%s\n",def ? def->name.data() : 0); if (def && def->nargs==-1) // simple macro { // substitute the definition of the macro + //printf("macro `%s'->`%s'\n",macroName.data(),def->definition.data()); expMacro=def->definition.stripWhiteSpace(); replaced=TRUE; len=l; @@ -774,6 +772,7 @@ Define *newDefine() def->fileName = g_yyFileName; def->lineNr = g_yyLineNr; def->varArgs = g_defVarArgs; + //printf("newDefine: `%s'->`%s'\n",def->name.data(),def->definition.data()); if (!def->name.isEmpty() && expandAsDefinedDict[def->name]) { def->isPredefined=TRUE; @@ -1520,7 +1519,7 @@ BN [ \t\r\n] g_defLitText+=yytext; outputChar('\n'); Define *def=0; - //printf("Define name=`%s' text=`%s'\n",g_defName.data(),g_defText.data()); + //printf("Define name=`%s' text=`%s' litTexti=`%s'\n",g_defName.data(),g_defText.data(),g_defLitText.data()); if (g_includeStack.isEmpty()) { addDefine(); @@ -1528,10 +1527,12 @@ BN [ \t\r\n] def=g_fileDefineDict->find(g_defName); if (def==0) // new define { + //printf("new define!\n"); g_fileDefineDict->insert(g_defName,newDefine()); } else if (def)// name already exists { + //printf("existing define!\n"); //printf("define found\n"); if (def->undef) // undefined name { @@ -1860,23 +1861,21 @@ void preprocessFile(const char *fileName,BufStr &output) else pclose(preYYin); -//#if DUMP_OUTPUT if (Debug::isFlagSet(Debug::Preprocessor)) { char *orgPos=output.data()+orgOffset; char *newPos=output.data()+output.curPos(); - printf("Preprocessor output (size: %d bytes):\n",newPos-orgPos); + msg("Preprocessor output (size: %d bytes):\n",newPos-orgPos); int line=1; - printf("---------\n00001 "); + msg("---------\n00001 "); while (orgPos<newPos) { putchar(*orgPos); if (*orgPos=='\n') printf("%05d ",++line); orgPos++; } - printf("\n---------\n"); + msg("\n---------\n"); } -//#endif } extern "C" { // some bogus code to keep the compiler happy diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index 1dc7e87..5239ffd 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -650,7 +650,7 @@ void RTFGenerator::startIndexSection(IndexSections is) bool found=FALSE; while (gd && !found) { - if (gd->isLinkableInProject() || gd->countMembers()>0) + if (gd->countMembers()>0) { beginRTFChapter(); found=TRUE; @@ -666,7 +666,7 @@ void RTFGenerator::startIndexSection(IndexSections is) bool found=FALSE; while (nd && !found) { - if (nd->isLinkableInProject()) + if (nd->isLinkableInProject() && nd->countMembers()>0) { beginRTFChapter(); found=TRUE; @@ -840,7 +840,7 @@ void RTFGenerator::endIndexSection(IndexSections is) bool found=FALSE; while (nd && !found) { - if (nd->isLinkableInProject() || nd->countMembers()>0) + if (nd->isLinkableInProject() && nd->countMembers()>0) { t << "\\par " << Rtf_Style["Reset"] << endl; t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \""; @@ -852,7 +852,7 @@ void RTFGenerator::endIndexSection(IndexSections is) } while (nd) { - if (nd->isLinkableInProject() || nd->countMembers()>0) + if (nd->isLinkableInProject() && nd->countMembers()>0) { t << "\\par " << Rtf_Style["Reset"] << endl; beginRTFSection(); diff --git a/src/scanner.l b/src/scanner.l index 9967667..ba99f5b 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -2449,7 +2449,7 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"") lineCount(); BEGIN( CompoundName ); } -<FindMembers>{B}*("disp")?"interface"{BN}+ { // M$/Corba IDL interface +<FindMembers>{B}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba IDL interface isTypedef=FALSE; current->section = Entry::INTERFACE_SEC; addType( current ) ; @@ -3157,24 +3157,31 @@ DOCPARAM ([a-z_A-Z0-9:\<\>\=\.\-]+)|("\"".*"\"") //printf("adding `%s' `%s' `%s' to enum `%s' (mGrpId=%d)\n", // current->type.data(), current->name.data(), // current->args.data(), current_root->name.data(),current->mGrpId); - current->fileName = yyFileName; - current->startLine = yyLineNr; - current->type = "@"; // enum marker - current->args = current->args.simplifyWhiteSpace(); - current->name = current->name.stripWhiteSpace(); - current->section = Entry::VARIABLE_SEC; - // add to the scope of the enum - current_root->addSubEntry(current); - current = new Entry(*current); - // add to the scope surrounding the enum (copy!) - current_root->parent->addSubEntry(current); - current = new Entry ; - current->protection = protection ; - current->sig = sig; - current->virt = virt; - current->stat = gstat; - current->slot = slot; - current->mGrpId = memberGroupId; + if (!current->name.isEmpty()) + { + current->fileName = yyFileName; + current->startLine = yyLineNr; + current->type = "@"; // enum marker + current->args = current->args.simplifyWhiteSpace(); + current->name = current->name.stripWhiteSpace(); + current->section = Entry::VARIABLE_SEC; + // add to the scope of the enum + current_root->addSubEntry(current); + current = new Entry(*current); + // add to the scope surrounding the enum (copy!) + current_root->parent->addSubEntry(current); + current = new Entry ; + current->protection = protection ; + current->sig = sig; + current->virt = virt; + current->stat = gstat; + current->slot = slot; + current->mGrpId = memberGroupId; + } + else // probably a redundant , + { + current->reset(); + } } /* <FindFieldArg>"," { unput(*yytext); BEGIN(FindFields); } diff --git a/src/translator_cz.h b/src/translator_cz.h index 0678483..dba350b 100644 --- a/src/translator_cz.h +++ b/src/translator_cz.h @@ -27,74 +27,43 @@ // // havran@fel.cvut.cz, 1999/04/11 // -// The first version of Czech strings with diacritics was implemented by -// Petr Prikryl (prikrylp@skil.cz). Vlastimil Havran is still -// the maintainer. The translation was based on translator.h -// of Doxygen versison 1.1.4 (from scratch) and updated for 1.1.5 -// (including important updates of the up-to-1.1.4 strings). -// -// The Czech strings in this file were first written in Windows 1250 -// encoding. The conditional compilation ensures or the neutral -// functionality of the macro DECODE, or calling the WinToISO() -// method for on-line encoding conversion. If you want to maintain -// the source in the ISO Latin-2, do convert the source, change the -// conditional definition of the DECODE macro using the method -// ISOToWin() -- for conversion of strings for the Windows version. -// The version which does not call the function is slightly faster. +// Updates: +// -------- +// 2000/06/20 +// - The prototype version of Czech strings with diacritics implemented by +// Petr Prikryl (prikrylp@skil.cz). (Vlastimil Havran is still +// the maintainer.) The translation was based on translator.h +// of Doxygen versison 1.1.4 (from scratch). // -// Notice: Only one of the following tables is necessary for -// the support as well as the only one conversion private method -// of the TranslatorCzech class. However, the prototype was created -// under WindowsNT thus using Windows 1250 encoding. The second -// table and the method are here to switch to the ISO Latin-2 -// smoothly. And also, there is not a big loose of space when both -// tables and methods are supported. - -/*! Translation tables for characters >127. They should work, - * but I would not put my hand into fire for that. - */ -static const char WinToISOTab[] = { - '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87', - '\x88', '\x89', '\xA9', '\x8B', '\xA6', '\xAB', '\xAE', '\xAC', - '\x90', '\x91', '\x92', '\x93', '\x94', '\x2E', '\x96', '\x97', - '\x98', '\x99', '\xB9', '\x9B', '\xB6', '\xBB', '\xBE', '\xBC', - '\xA0', '\x20', '\x20', '\xA3', '\xA4', '\xA1', '\xA6', '\xA7', - '\x22', '\xA9', '\xAA', '\x3C', '\xAC', '\x2D', '\xAE', '\xAF', - '\x2E', '\x2B', '\x20', '\xB3', '\x27', '\x75', '\xB6', '\xB7', - '\x20', '\xB1', '\xBA', '\x3E', '\xA5', '\x22', '\xB5', '\xBF', - '\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7', - '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF', - '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7', - '\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF', - '\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7', - '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF', - '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\x2D', - '\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF', - '\0' -}; - -static const char ISOToWinTab[] = { - '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87', - '\x88', '\x89', '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F', - '\x90', '\x91', '\x92', '\x93', '\x94', '\x95', '\x96', '\x97', - '\x98', '\x99', '\x9A', '\x9B', '\x9C', '\x9D', '\x9E', '\x9F', - '\xA0', '\xA5', '\xA2', '\xA3', '\xA4', '\xBC', '\x8C', '\xA7', - '\xA8', '\x8A', '\xAA', '\x8D', '\x8F', '\xAD', '\x8E', '\xAF', - '\xB0', '\xB9', '\xB2', '\xB3', '\xB4', '\xBE', '\x9C', '\xB7', - '\xB8', '\x9A', '\xBA', '\x9D', '\x9F', '\xBD', '\x9E', '\xBF', - '\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7', - '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF', - '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7', - '\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF', - '\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7', - '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF', - '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\xF7', - '\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF', - '\0' -}; +// 2000/07/10 (Petr Prikryl) +// - Updated version based on 1.1.5 sources (including important updates +// of the up-to-1.1.4 strings). Czech strings this file were written +// in windows-1250 encoding. On-line decoding into iso-8859-2 ensured +// via conditional compilation if the sources are compiled under UNIX. +// +// 2000/07/19 (Petr Prikryl) +// - Encoding conversion tables moved to the methods that use them. +// - Updates for "new since 1.1.5". +// +// Notices: +// -------- +// The conditional compilation ensures or the neutral functionality +// of the macro DECODE, or calling the WinToISO() method for +// on-line encoding conversion. If you want to maintain the source +// in the iso-8859-2, do convert the source, change the conditional +// definition of the DECODE macro using the method ISOToWin() -- +// for conversion of strings for the Windows version. The version +// which does not call the function is slightly faster. +// +// Only one of the private method WinToISO() and ISOToWin() is +// necessary depending on whether this source is maintained in +// windows-1250 or iso-8859-2 encoding. However, there is not a +// big loose of space when both methods with the conversion tables +// are supported. The other (not used now) may be handy in future. +// Do not erase it. -// Here the DECODE macro assumes the source written in Win1250 encoding. +// Here the DECODE macro assumes the source written in Windows encoding. // #ifdef _WIN32 #define DECODE(sInput) sInput @@ -103,13 +72,34 @@ static const char ISOToWinTab[] = { #endif - class TranslatorCzech : public Translator { private: - /*! returns the string converted from Win1250 to ISO Latin-2 */ + /*! returns the string converted from windows-1250 to iso-8859-2 */ QCString WinToISO(const QCString sInput) { + // The conversion table for characters >127 + // + static const char WinToISOTab[] = { + '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87', + '\x88', '\x89', '\xA9', '\x8B', '\xA6', '\xAB', '\xAE', '\xAC', + '\x90', '\x91', '\x92', '\x93', '\x94', '\x2E', '\x96', '\x97', + '\x98', '\x99', '\xB9', '\x9B', '\xB6', '\xBB', '\xBE', '\xBC', + '\xA0', '\x20', '\x20', '\xA3', '\xA4', '\xA1', '\xA6', '\xA7', + '\x22', '\xA9', '\xAA', '\x3C', '\xAC', '\x2D', '\xAE', '\xAF', + '\x2E', '\x2B', '\x20', '\xB3', '\x27', '\x75', '\xB6', '\xB7', + '\x20', '\xB1', '\xBA', '\x3E', '\xA5', '\x22', '\xB5', '\xBF', + '\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7', + '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF', + '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7', + '\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF', + '\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7', + '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF', + '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\x2D', + '\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF', + '\0' + }; + QCString result; int len = sInput.length(); @@ -121,9 +111,30 @@ class TranslatorCzech : public Translator return result; } - /*! returns the string converted from ISO Latin-2 to Win1250 */ + /*! returns the string converted from iso-8859-2 to windows-1250 */ QCString ISOToWin(const QCString sInput) { + // The conversion table for characters >127 + // + static const char ISOToWinTab[] = { + '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87', + '\x88', '\x89', '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F', + '\x90', '\x91', '\x92', '\x93', '\x94', '\x95', '\x96', '\x97', + '\x98', '\x99', '\x9A', '\x9B', '\x9C', '\x9D', '\x9E', '\x9F', + '\xA0', '\xA5', '\xA2', '\xA3', '\xA4', '\xBC', '\x8C', '\xA7', + '\xA8', '\x8A', '\xAA', '\x8D', '\x8F', '\xAD', '\x8E', '\xAF', + '\xB0', '\xB9', '\xB2', '\xB3', '\xB4', '\xBE', '\x9C', '\xB7', + '\xB8', '\x9A', '\xBA', '\x9D', '\x9F', '\xBD', '\x9E', '\xBF', + '\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7', + '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF', + '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7', + '\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF', + '\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7', + '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF', + '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\xF7', + '\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF', + '\0' + }; QCString result; int len = sInput.length(); @@ -136,6 +147,8 @@ class TranslatorCzech : public Translator } public: + // --- Language contol methods ------------------- + virtual QCString idLanguage() { return "czech"; } @@ -146,6 +159,18 @@ class TranslatorCzech : public Translator virtual QCString latexBabelPackage() { return ""; } + /*! return the language charset. This will be used for the HTML output */ + virtual QCString idLanguageCharset() + { +#ifdef _WIN32 + return "windows-1250"; +#else + return "iso-8859-2"; +#endif + } + + // --- Language translation methods ------------------- + /*! used in the compound documentation before a list of related functions. */ virtual QCString trRelatedFunctions() { return DECODE("Související funkce"); } @@ -567,7 +592,7 @@ class TranslatorCzech : public Translator /*! this text is generated when the \return command is used. */ virtual QCString trReturns() - { return DECODE("Vrací"); } + { return DECODE("Návratová hodnota"); } /*! this text is generated when the \sa command is used. */ virtual QCString trSeeAlso() @@ -642,7 +667,7 @@ class TranslatorCzech : public Translator /*! used as the title of the HTML page of a file */ virtual QCString trFileReference(const char *fileName) { - QCString result="Dokumentace souboru "; + QCString result("Dokumentace souboru "); result+=fileName; return DECODE(result); } @@ -650,7 +675,7 @@ class TranslatorCzech : public Translator /*! used as the title of the HTML page of a namespace */ virtual QCString trNamespaceReference(const char *namespaceName) { - QCString result("Dokumentace prostroru jmen "); + QCString result("Dokumentace prostoru jmen "); result+=namespaceName; return DECODE(result); } @@ -718,7 +743,10 @@ class TranslatorCzech : public Translator */ virtual QCString trInheritedByList(int numEntries) { - return DECODE("Zdìdìna tøídami "+trWriteList(numEntries)+"."); + QCString result("Zdìdìna "); + result += (numEntries == 1) ? "tøídou " : "tøídami "; + result += trWriteList(numEntries)+"."; + return DECODE(result); } /*! used in member documentation blocks to produce a list of @@ -726,7 +754,10 @@ class TranslatorCzech : public Translator */ virtual QCString trReimplementedFromList(int numEntries) { - return DECODE("Reimplementace metody tøídy "+trWriteList(numEntries)+"."); + QCString result("Reimplementuje "); + result += (numEntries == 1) ? "metodu tøídy " : "metody tøíd "; + result += trWriteList(numEntries)+"."; + return DECODE(result); } /*! used in member documentation blocks to produce a list of @@ -734,7 +765,10 @@ class TranslatorCzech : public Translator */ virtual QCString trReimplementedInList(int numEntries) { - return DECODE("Reimplementováno v "+trWriteList(numEntries)+"."); + QCString result("Reimplementováno "); + result += (numEntries == 1) ? "tøídou " : "tøídami "; + result += trWriteList(numEntries)+"."; + return DECODE(result); } /*! This is put above each page as a link to all members of namespaces. */ @@ -1010,6 +1044,90 @@ class TranslatorCzech : public Translator { return DECODE("Od"); // ??? not checked in a context } + +//////////////////////////////////////////////////////////////////////////// +// new since 1.1.5 +////////////////////////////////////////////////////////////////////////// + + /*! title of the graph legend page */ + virtual QCString trLegendTitle() + { + return DECODE("Vysvìtlivky ke grafu"); + } + /*! page explaining how the dot graph's should be interpreted */ + virtual QCString trLegendDocs() + { + QCString result( + "Zde naleznete vysvìtlení, jak mají být interpretovány grafy, " + "které byly generovány programem doxygen.<p>\n" + "Uvažujte následující pøíklad:\n" + "\\code\n" + "/*! Neviditelná tøída, která se v grafu nezobrazuje, protože " + "došlo k oøezání grafu. */\n" + "class Invisible { };\n\n" + "/*! Tøída, u které došlo k oøezání grafu. Vztah dìdiènosti " + "je skryt. */\n" + "class Truncated : public Invisible { };\n\n" + "/* Tøída, která není dokumentována komentáøi programu doxygen. */\n" + "class Undocumented { };\n\n" + "/*! Odvozená tøída s veøejným (public) dìdìním bázové tøídy. */\n" + "class PublicBase : public Truncated { };\n\n" + "/*! Odvozená tøída s chránìným (protected) dìdìním bázové tøídy. */\n" + "class ProtectedBase { };\n\n" + "/*! Odvozená tøída s privátním dìdìním bázové tøídy. */\n" + "class PrivateBase { };\n\n" + "/*! Tøída, která je využívána tøídou Inherited. */\n" + "class Used { };\n\n" + "/*! Odvozená tøída, která rùzným zpùsobem dìdí z více bázových " + "tøíd. */\n" + "class Inherited : public PublicBase,\n" + " protected ProtectedBase,\n" + " private PrivateBase,\n" + " public Undocumented\n" + "{\n" + " private:\n" + " Used *m_usedClass;\n" + "};\n" + "\\endcode\n" + "Pokud je položka \\c MAX_DOT_GRAPH_HEIGHT konfiguraèního souboru " + "nastavena na hodnotu 200, bude vygenerován následující graf:" + "<p><center><img src=\"graph_legend.gif\"></center>\n" + "<p>\n" + "Bloky (tj. uzly) v uvedeném grafu mají následující význam:\n" + "<ul>\n" + "<li>Èernì vyplnìný obdélník reprezentuje strukturu nebo tøídu, " + "pro kterou byl graf generován.\n" + "<li>Obdélník s èerným obrysem oznaèuje dokumentovanou " + "strukturu nebo tøídu.\n" + "<li>Obdélník s šedým obrysem oznaèuje nedokumentovanou " + "strukturu nebo tøídu.\n" + "<li>Obdélník s èerveným obrysem oznaèuje dokumentovanou " + "strukturu nebo tøídu, pro kterou\n" + "nejsou zobrazeny všechny vztahy dìdiènosti nebo obsažení. " + "Graf je oøezán v pøípadì, kdy jej\n" + "není možné umístit do vymezených hranic.\n" + "</ul>\n" + "Šipky (tj. hrany grafu) mají následující význam:\n" + "<ul>\n" + "<li>Tmavì modrá šipka se používá pro oznaèení vztahu veøejné " + "dìdiènosti mezi dvìma tøídami.\n" + "<li>Tmavì zelená šipka oznaèuje vztah chránìné dìdiènosti " + "(protected).\n" + "<li>Tmavì èervená šipka oznaèuje vztah privátní dìdiènosti.\n" + "<li>Purpurová šipka kreslená èárkovanì se používá v pøípadì, " + "kdy je tøída obsažena v jiné tøídì,\n" + "nebo kdy je používána jinou tøídou. Je oznaèena identifikátorem " + "jedné nebo více promìných, pøes které\n" + "je tøída nebo struktura zpøístupnìna.\n" + "</ul>\n"); + + return DECODE(result); + } + /*! text for the link to the legend page */ + virtual QCString trLegend() + { + return DECODE("vysvìtlivky"); + } }; #endif // TRANSLATOR_CZ_H diff --git a/src/translator_nl.h b/src/translator_nl.h index 99812f2..1112ce8 100644 --- a/src/translator_nl.h +++ b/src/translator_nl.h @@ -583,10 +583,119 @@ class TranslatorDutch : public Translator return "Static Private Attributen"; } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.3 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a marker that is put before a todo item */ + QCString trTodo() + { + return "Todo"; + } + /*! Used as the header of the todo list */ + QCString trTodoList() + { + return "Todo Lijst"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.4 +////////////////////////////////////////////////////////////////////////// + + QCString trReferencedBy() + { + return "Wordt aangeroepen door"; + } + QCString trRemarks() + { + return "Opmerkingen"; + } + QCString trAttention() + { + return "Attentie"; + } + QCString trInclByDepGraph() + { + return "Deze graaf geeft aan welke files direct of " + "indirect afhankelijk zijn van deze file:"; + } + QCString trSince() + { + return "Sinds"; + } + ////////////////////////////////////////////////////////////////////////// -// new since 1.1.1 +// new since 1.1.5 ////////////////////////////////////////////////////////////////////////// + /*! title of the graph legend page */ + QCString trLegendTitle() + { + return "Graaf Legenda"; + } + /*! page explaining how the dot graph's should be interpreted */ + QCString trLegendDocs() + { + return + "Deze pagina legt uit hoe de grafen die gegenereerd worden door doxygen " + "geïnterpreteerd dienen te worden.<p>\n" + "Beschouw het volgende voorbeeld:\n" + "\\code\n" + "/*! Onzichtbare klasse vanwege afkappen van de graaf */\n" + "class Invisible { };\n\n" + "/*! Afgekapte klasse, overervingsrelatie is verborgen */\n" + "class Truncated : public Invisible { };\n\n" + "/* Klasse is niet gedocumenteerd met doxygen commentaar */\n" + "class Undocumented { };\n\n" + "/*! Klasse met public inheritance */\n" + "class PublicBase : public Truncated { };\n\n" + "/*! Klasse met protected inheritance */\n" + "class ProtectedBase { };\n\n" + "/*! Klasse met private inheritance */\n" + "class PrivateBase { };\n\n" + "/*! Klasse die wordt gebruikt door de klasse Inherited */\n" + "class Used { };\n\n" + "/*! Super klasse die overerft van een aantal andere klassen */\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" + "Als de \\c MAX_DOT_GRAPH_HEIGHT tag in the configuratie file " + "op 200 gezet is, zal het bestaande voorbeeld resulteren in de volgende graaf:" + "<p><center><img src=\"graph_legend.gif\"></center>\n" + "<p>\n" + "De rechthoeken in the bovenstaande graaf hebben de volgende betekenis:\n" + "<ul>\n" + "<li>Een gevulde zwarte rechthoek representeert de structure of klasse waarvoor " + "de graaf is gegeneerd.\n" + "<li>Een rechthoek met een zwarte rand representeert een gedocumenteerde structure of klasse.\n" + "<li>Een rechthoek met een grijze rand representeert een ongedocumenteerde structure of klasse.\n" + "<li>Een rechthoek met een rode rand representeert een gedocumenteerde structure or klasse waarvoor\n" + "niet alle overervings- of gebruiksrelaties konden worden getoond. Een graaf wordt " + "afgekapt als hij niet past binnen de gespecificeerde grenzen." + "</ul>\n" + "De pijlen hebben de volgende betekenis:\n" + "<ul>\n" + "<li>Een donkerblauwe pijl visualizeert een public inheritance " + "relatie tussen twee klassen.\n" + "<li>Een donkergroene pijl wordt gebruikt voor protected inheritance.\n" + "<li>Een donkerrode pijl wordt gebruikt voor private inheritance.\n" + "<li>Een paars gestreepte pijl wordt gebruikt indien een klasse bevat is of gebruikt wordt " + "door een andere klasse. De pijl is gelabeled met de variable(n) " + "die toegang geven tot de aangewezen klasse of structure. \n" + "</ul>\n"; + } + /*! text for the link to the legend page */ + QCString trLegend() + { + return "legenda"; + } }; #endif diff --git a/src/translator_pt.h b/src/translator_pt.h new file mode 100644 index 0000000..8b6e3af --- /dev/null +++ b/src/translator_pt.h @@ -0,0 +1,884 @@ +/****************************************************************************** + * + * + * + * 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 Portuguese was provided by + * Rui Godinho Lopes <ruiglopes@yahoo.com> + */ + +#ifndef TRANSLATOR_PT_H +#define TRANSLATOR_PT_H + +#include "translator.h" + +class TranslatorPortuguese : public Translator +{ + public: + QCString idLanguage() + { return "portuguese"; } + /*! returns the name of the package that is included by LaTeX */ + QCString latexBabelPackage() + { return "portuguese"; } + + /*! used in the compound documentation before a list of related functions. */ + QCString trRelatedFunctions() + { return "Funções associadas"; } + + /*! subscript for the related functions. */ + QCString trRelatedSubscript() + { return "(Note que não são funções membro)"; } + + /*! header that is put before the detailed description of files, classes and namespaces. */ + QCString trDetailedDescription() + { return "Descrição detalhada"; } + + /*! header that is put before the list of typedefs. */ + QCString trMemberTypedefDocumentation() + { return "Documentação de tipos definidos"; } + + /*! header that is put before the list of enumerations. */ + QCString trMemberEnumerationDocumentation() + { return "Documentação da enumerações"; } + + /*! header that is put before the list of member functions. */ + QCString trMemberFunctionDocumentation() + { return "Documentação dos métodos"; } + + /*! header that is put before the list of member attributes. */ + QCString trMemberDataDocumentation() + { return "Documentação dos dados"; } + + /*! this is the text of a link put after brief descriptions. */ + QCString trMore() + { return "Mais..."; } + + /*! put in the class documentation */ + QCString trListOfAllMembers() + { return "Mostrar lista completa dos membros"; } + + /*! used as the title of the "list of all members" page of a class */ + QCString trMemberList() + { return "Lista dos membros"; } + + /*! this is the first part of a sentence that is followed by a class name */ + QCString trThisIsTheListOfAllMembers() + { return "Esta é a lista completa dos membros de "; } + + /*! this is the remainder of the sentence after the class name */ + QCString trIncludingInheritedMembers() + { return ", incluindo todos os membros herdados."; } + + /*! this is put at the author sections at the bottom of man pages. + * parameter s is name of the project name. + */ + QCString trGeneratedAutomatically(const char *s) + { QCString result="Gerado automaticamente por Doxygen"; + if (s) result+=(QCString)" para "+s; + result+=" a partir do código fonte."; + return result; + } + + /*! put after an enum name in the list of all members */ + QCString trEnumName() + { return "enumeração"; } + + /*! put after an enum value in the list of all members */ + QCString trEnumValue() + { return "valor enumerado"; } + + /*! put after an undocumented member in the list of all members */ + 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 + * compounds or files (see the \group command). + */ + QCString trModules() + { return "Módulos"; } + + /*! This is put above each page as a link to the class hierarchy */ + QCString trClassHierarchy() + { return "Hierarquia de classes"; } + + /*! This is put above each page as a link to the list of annotated classes */ + QCString trCompoundList() + { return "Lista de componentes"; + + /*! 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"; } + + /*! This is put above each page as a link to all members of compounds. */ + QCString trCompoundMembers() + { return "Componentes"; } + + /*! This is put above each page as a link to all members of files. */ + QCString trFileMembers() + { return "Declarações"; } + + /*! This is put above each page as a link to all related pages. */ + QCString trRelatedPages() + { return "Paginas relacionadas"; } + + /*! This is put above each page as a link to all examples. */ + QCString trExamples() + { return "Exemplos"; } + + /*! This is put above each page as a link to the search engine. */ + QCString trSearch() + { return "Localizar"; } + + /*! This is an introduction to the class hierarchy. */ + QCString trClassHierarchyDescription() + { return "Esta lista de heranças está organizada, dentro do possível, por ordem alfabética:"; } + + /*! This is an introduction to the list with all files. */ + QCString trFileListDescription(bool extractAll) + { + QCString result="Lista de todos os ficheiros "; + if (!extractAll) result+="documentados "; + result+="com uma breve descrição:"; + return result; + } + + /*! 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:"; + } + + /*! 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:"; + 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 "; + result+="com links para "; + if (extractAll) result+="a documentação correspondente:"; + else result+="os ficheiros onde foram definidas:"; + return result; + } + + /*! This is an introduction to the page with the list of all header files. */ + QCString trHeaderFilesDescription() + { return "Lista de todos os ficheiros cabeçalho que constituem a API:"; } + + /*! This is an introduction to the page with the list of all examples */ + QCString trExamplesDescription() + { return "Lista de todos os exemplos:"; } + + /*! This is an introduction to the page with the list of related pages */ + QCString trRelatedPagesDescription() + { return "Lista de documentação relacionada:"; } + + /*! This is an introduction to the page with the list of class/file groups */ + QCString trModulesDescription() + { return "Lista de todos os módulos:"; } + + /*! This sentences is used in the annotated class/file lists if no brief + * description is given. + */ + QCString trNoDescriptionAvailable() + { return "Nenhuma descrição disponível"; } + + // index titles (the project name is prepended for these) + + + /*! This is used in HTML as the title of index.html. */ + QCString trDocumentation() + { return "Documentação"; } + + /*! This is used in LaTeX as the title of the chapter with the + * index of all groups. + */ + QCString trModuleIndex() + { return "Índice dos módulos"; } + + /*! This is used in LaTeX as the title of the chapter with the + * class hierarchy. + */ + QCString trHierarchicalIndex() + { return "Índice da hierarquia"; } + + /*! This is used in LaTeX as the title of the chapter with the + * annotated compound index. + */ + QCString trCompoundIndex() + { return "Índice dos componentes"; } + + /*! This is used in LaTeX as the title of the chapter with the + * list of all files. + */ + QCString trFileIndex() + { return "Índice dos ficheiros"; } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all groups. + */ + QCString trModuleDocumentation() + { return "Documentação do módulo"; } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all classes, structs and unions. + */ + QCString trClassDocumentation() + { return "Documentação da classe"; } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all files. + */ + QCString trFileDocumentation() + { return "Documentação do ficheiro"; } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all examples. + */ + QCString trExampleDocumentation() + { return "Documentação do exemplo"; } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all related pages. + */ + QCString trPageDocumentation() + { return "Documentação da página"; } + + /*! This is used in LaTeX as the title of the document */ + QCString trReferenceManual() + { return "Manual de referência"; } + + /*! This is used in the documentation of a file as a header before the + * list of defines + */ + QCString trDefines() + { return "Definição de macros"; } + + /*! This is used in the documentation of a file as a header before the + * list of function prototypes + */ + QCString trFuncProtos() + { return "Protótipos de funções"; } + + /*! This is used in the documentation of a file as a header before the + * list of typedefs + */ + QCString trTypedefs() + { return "Definição de tipos"; } + + /*! This is used in the documentation of a file as a header before the + * list of enumerations + */ + QCString trEnumerations() + { return "Enumerações"; } + + /*! This is used in the documentation of a file as a header before the + * list of (global) functions + */ + QCString trFunctions() + { return "Funções"; } + + /*! This is used in the documentation of a file as a header before the + * list of (global) variables + */ + QCString trVariables() + { return "Variáveis"; } + + /*! This is used in the documentation of a file as a header before the + * list of (global) variables + */ + QCString trEnumerationValues() + { return "Valores da enumeração"; } + + /*! This is used in man pages as the author section. */ + QCString trAuthor() + { return "Autor"; } + + /*! This is used in the documentation of a file before the list of + * documentation blocks for defines + */ + QCString trDefineDocumentation() + { return "Documentação da macro"; } + + /*! 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"; } + + /*! 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"; } + + /*! 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"; } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for enumeration values + */ + QCString trEnumerationValueDocumentation() + { return "Documentação dos elementos da enumeração"; } + + /*! This is used in the documentation of a file/namespace before the list + * of documentation blocks for functions + */ + QCString trFunctionDocumentation() + { return "Documentação da função"; } + + /*! 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"; } + + /*! This is used in the documentation of a file/namespace/group before + * the list of links to documented compounds + */ + QCString trCompounds() + { return "Componentes"; } + + /*! This is used in the documentation of a group before the list of + * links to documented files + */ + QCString trFiles() + { return "Ficheiros"; } + + /*! This is used in the standard footer of each page and indicates when + * the page was generated + */ + QCString trGeneratedAt(const char *date,const char *projName) + { + QCString result=(QCString)"Gerado em "+date; + if (projName) result+=(QCString)" para "+projName; + result+=(QCString)" por"; + return result; + } + /*! This is part of the sentence used in the standard footer of each page. + */ + QCString trWrittenBy() + { + return "escrito por"; + } + + /*! this text is put before a class diagram */ + QCString trClassDiagram(const char *clName) + { + return (QCString)"Diagrama de heranças da classe "+clName; + } + + /*! this text is generated when the \internal command is used. */ + QCString trForInternalUseOnly() + { return "Apenas para uso interno."; } + + /*! this text is generated when the \reimp command is used. */ + QCString trReimplementedForInternalReasons() + { return "Redefinido por razões internas; o interface não é afectado"; + } + + /*! this text is generated when the \warning command is used. */ + QCString trWarning() + { return "Aviso"; } + + /*! this text is generated when the \bug command is used. */ + QCString trBugsAndLimitations() + { return "Bugs e limitações"; } + + /*! this text is generated when the \version command is used. */ + QCString trVersion() + { return "Versão"; } + + /*! this text is generated when the \date command is used. */ + QCString trDate() + { return "Data"; } + + /*! this text is generated when the \author command is used. */ + QCString trAuthors() + { return "Autor(es)"; } + + /*! this text is generated when the \return command is used. */ + QCString trReturns() + { return "Retorna"; } + + /*! this text is generated when the \sa command is used. */ + QCString trSeeAlso() + { return "Veja também"; } + + /*! this text is generated when the \param command is used. */ + QCString trParameters() + { return "Parâmetros"; } + + /*! this text is generated when the \exception command is used. */ + QCString trExceptions() + { return "Excepções"; } + + /*! this text is used in the title page of a LaTeX document. */ + QCString trGeneratedBy() + { return "Gerado por"; } + + // new since 0.49-990307 + + virtual QCString trNamespaceList() + { return "Lista de namespaces"; } + + /*! used as an introduction to the namespace list */ + virtual QCString trNamespaceListDescription(bool extractAll) + { + QCString result="Lista "; + if (!extractAll) result+="de toda a documentação "; + result+="dos namespaces com uma breve descrição:"; + return result; + } + + /*! used in the class documentation as a header before the list of all + * friends of a class + */ + virtual QCString trFriends() + { return "Amigos"; } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990405 +////////////////////////////////////////////////////////////////////////// + + /*! used in the class documentation as a header before the list of all + * related classes + */ + virtual QCString trRelatedFunctionDocumentation() + { return "Documentação das funções relacionadas e classes amigas"; } + +////////////////////////////////////////////////////////////////////////// +// 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="Referencia "; + switch(compType) + { + case ClassDef::Class: result+="à classe "; break; + case ClassDef::Struct: result+="à estrutura "; break; + case ClassDef::Union: result+="à união "; break; + case ClassDef::Interface: result+="ao interface "; break; + case ClassDef::Exception: result+="à excepção "; break; + } + + if (isTemplate) + result+="<template> "; + + result+=(QCString)clName; + return result; + } + + /*! used as the title of the HTML page of a file */ + virtual QCString trFileReference(const char *fileName) + { + QCString result= "Referencia ao ficheiro "; + result += fileName; + return result; + } + + /*! used as the title of the HTML page of a namespace */ + virtual QCString trNamespaceReference(const char *namespaceName) + { + QCString result= "Referencia ao namespace "; + result += namespaceName; + return result; + } + + /*! \mgroup Class sections + * these are for the member sections of a class, struct or union + */ + virtual QCString trPublicMembers() + { return "Membros públicos"; } + virtual QCString trPublicSlots() + { return "Slots públicos"; } + virtual QCString trSignals() + { return "Sinais"; } + virtual QCString trStaticPublicMembers() + { return "Membros públicos estáticos"; } + virtual QCString trProtectedMembers() + { return "Membros protegidos"; } + virtual QCString trProtectedSlots() + { return "Slots protegidos"; } + virtual QCString trStaticProtectedMembers() + { return "Membros protegidos estáticos"; } + virtual QCString trPrivateMembers() + { return "Membros privados"; } + virtual QCString trPrivateSlots() + { return "Slots privados"; } + virtual QCString trStaticPrivateMembers() + { return "Membros privados estáticos"; } + /*! \endmgroup */ + + /*! 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+=", e "; + } + } + return result; + } + + /*! used in class documentation to produce a list of base classes, + * if class diagrams are disabled. + */ + virtual QCString trInheritsList(int numEntries) + { + return "Derivada de "+trWriteList(numEntries)+"."; + } + + /*! used in class documentation to produce a list of super classes, + * if class diagrams are disabled. + */ + virtual QCString trInheritedByList(int numEntries) + { + return "Herdado por "+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 "Reimplementado de "+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 "Reimplementado em "+trWriteList(numEntries)+"."; + } + + /*! This is put above each page as a link to all members of namespaces. */ + virtual QCString trNamespaceMembers() + { return "Membros do namespace"; } + + /*! This is an introduction to the page with all namespace members */ + virtual QCString trNamespaceMemberDescription(bool extractAll) + { + QCString result="Lista "; + 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:"; + return result; + } + + /*! This is used in LaTeX as the title of the chapter with the + * index of all namespaces. + */ + virtual QCString trNamespaceIndex() + { return "Índice dos namespaces"; } + + /*! This is used in LaTeX as the title of the chapter containing + * the documentation of all namespaces. + */ + virtual QCString trNamespaceDocumentation() + { return "Documentação dos namespaces"; } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990522 +////////////////////////////////////////////////////////////////////////// + + /*! This is used in the documentation before the list of all + * namespaces in a file. + */ + virtual QCString trNamespaces() + { return "Namespaces"; } + +////////////////////////////////////////////////////////////////////////// +// 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)"A documentação para "; + switch(compType) + { + case ClassDef::Class: result+="esta classe"; break; + case ClassDef::Struct: result+="esta estrutura"; break; + case ClassDef::Union: result+="esta união"; break; + case ClassDef::Interface: result+="este interface"; break; + case ClassDef::Exception: result+="esta excepção"; break; + } + result+=" foi gerada a partir "; + if (single) result+=" do seguinte ficheiro:"; + else result+="dos seguintes ficheiros:"; + return result; + } + + /*! This is in the (quick) index as a link to the alphabetical compound + * list. + */ + virtual QCString trAlphabeticalList() + { + return "Lista alfabética"; + } + + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-990901 +////////////////////////////////////////////////////////////////////////// + + /*! This is used as the heading text for the retval command. */ + virtual QCString trReturnValues() + { return "Valores retornados"; } + + /*! This is in the (quick) index as a link to the main page (index.html) + */ + virtual QCString trMainPage() + { return "Página principal"; } + + /*! This is used in references to page that are put in the LaTeX + * documentation. It should be an abbreviation of the word page. + */ + virtual QCString trPageAbbreviation() + { return "p. "; } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-991003 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trSources() + { + return "Fontes"; + } + virtual QCString trDefinedAtLineInSourceFile() + { + return "Definido na linha @0 do ficheiro @1."; + } + virtual QCString trDefinedInSourceFile() + { + return "Definido no ficheiro @0."; + } + +////////////////////////////////////////////////////////////////////////// +// new since 0.49-991205 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trDeprecated() + { + return "Desaprovado"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.0.0 +////////////////////////////////////////////////////////////////////////// + + /*! this text is put before a collaboration diagram */ + virtual QCString trCollaborationDiagram(const char *clName) + { + return (QCString)"Diagrama de colaboração para "+clName+":"; + } + /*! this text is put before an include dependency graph */ + virtual QCString trInclDepGraph(const char *fName) + { + return (QCString)"Diagrama de dependências de inclusão para "+fName+":"; + } + /*! header that is put before the list of constructor/destructors. */ + virtual QCString trConstructorDocumentation() + { + return "Documentação do Construtor & Destrutor"; + } + /*! Used in the file documentation to point to the corresponding sources. */ + virtual QCString trGotoSourceCode() + { + return "Ir para o código fonte deste ficheiro."; + } + /*! Used in the file sources to point to the corresponding documentation. */ + virtual QCString trGotoDocumentation() + { + return "Ir para a documentação deste ficheiro."; + } + /*! Text for the \pre command */ + virtual QCString trPrecondition() + { + return "Precondição"; + } + /*! Text for the \post command */ + virtual QCString trPostcondition() + { + return "Poscondição"; + } + /*! Text for the \invariant command */ + virtual QCString trInvariant() + { + return "Invariante"; + } + /*! Text shown before a multi-line variable/enum initialization */ + virtual QCString trInitialValue() + { + return "Valor inicial:"; + } + /*! Text used the source code in the file index */ + virtual QCString trCode() + { + return "código"; + } + virtual QCString trGraphicalHierarchy() + { + return "Representação gráfica da hiearquia da classe"; + } + virtual QCString trGotoGraphicalHierarchy() + { + return "Ir para a representação gráfica da hierarquia da classe"; + } + virtual QCString trGotoTextualHierarchy() + { + return "Ir para a representação textual da hierarquia da classe"; + } + virtual QCString trPageIndex() + { + return "Índice da página"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.0 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trNote() + { + return "Nota"; + } + virtual QCString trPublicTypes() + { + return "Tipos Públicos"; + } + virtual QCString trPublicAttribs() + { + return "Atributos Públicos"; + } + virtual QCString trStaticPublicAttribs() + { + return "Atributos Públicos Estáticos"; + } + virtual QCString trProtectedTypes() + { + return "Tipos Protegidos"; + } + virtual QCString trProtectedAttribs() + { + return "Atributos Protegidos"; + } + virtual QCString trStaticProtectedAttribs() + { + return "Atributos Protegidos Estáticos"; + } + virtual QCString trPrivateTypes() + { + return "Tipos Privados"; + } + virtual QCString trPrivateAttribs() + { + return "Atributos Privados"; + } + virtual QCString trStaticPrivateAttribs() + { + return "Atributos Privados Estáticos"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.3 +////////////////////////////////////////////////////////////////////////// + + /*! Used as a marker that is put before a todo item */ + virtual QCString trTodo() + { + return "Tarefa"; + } + /*! Used as the header of the todo list */ + virtual QCString trTodoList() + { + return "Lista de tarefas"; + } + +////////////////////////////////////////////////////////////////////////// +// new since 1.1.4 +////////////////////////////////////////////////////////////////////////// + + virtual QCString trReferencedBy() + { + return "Referenciado por"; + } + virtual QCString trRemarks() + { + return "Observações"; + } + virtual QCString trAttention() + { + return "Atenção"; + } + virtual QCString trInclByDepGraph() + { + return "Este gráfico mostra quais são os ficheiros que incluem directamente ou indirectamente este ficheiro:"; + } + virtual QCString trSince() + { + return "Desde"; + } + +}; +#endif diff --git a/src/util.cpp b/src/util.cpp index 563c0e6..8d29fd4 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -300,13 +300,19 @@ QCString removeRedundantWhiteSpace(const QCString &s) for (i=0;i<l;i++) { char c=s.at(i); - if (i<l-2 && c=='<' && (isId(s.at(i+1)) || isspace(s.at(i+1)))) + if (i<l-2 && c=='<' && // current char is a < + (isId(s.at(i+1)) || isspace(s.at(i+1))) && // next char is a id char or space + (i<8 || s.mid(i-8,8)!="operator") // string in front is not "operator" + ) { - result+="< "; + result+="< "; // insert extra space for layouting (nested) templates } - else if (i>0 && c=='>' && (isId(s.at(i-1)) || isspace(s.at(i-1)))) + else if (i>0 && c=='>' && // current char is a > + (isId(s.at(i-1)) || isspace(s.at(i-1))) && // prev char is a id char or space + (i<8 || s.mid(i-8,8)!="operator") // string in front is not "operator" + ) { - result+=" >"; + result+=" >"; // insert extra space for layouting (nested) templates } else if (c!=' ' || (i!=0 && i!=l-1 && isId(s.at(i-1)) && isId(s.at(i+1))) @@ -1480,7 +1486,7 @@ bool getDefs(const QCString &scName,const QCString &memberName, //printf("Trying class scope %s\n",className.data()); ClassDef *fcd=0; - if ((fcd=getClass(className)) && // is it a documented class + if ((fcd=getResolvedClass(className)) && // is it a documented class fcd->isLinkable() ) { @@ -1501,7 +1507,7 @@ bool getDefs(const QCString &scName,const QCString &memberName, //printf("match=%d\n",match); if (match) { - ClassDef *mcd=mmd->memberClass(); + ClassDef *mcd=mmd->getClassDef(); int m=minClassDistance(fcd,mcd); if (m<mdist && mcd->isLinkable()) { @@ -1533,7 +1539,7 @@ bool getDefs(const QCString &scName,const QCString &memberName, mmd->isLinkable() ) { - ClassDef *mcd=mmd->memberClass(); + ClassDef *mcd=mmd->getClassDef(); //printf(" >Class %s found\n",mcd->name().data()); int m=minClassDistance(fcd,mcd); if (m<mdist && mcd->isLinkable()) @@ -1594,9 +1600,9 @@ bool getDefs(const QCString &scName,const QCString &memberName, MemberDef *mmd=mn->first(); while (mmd && !found) { - //printf("mmd->getNamespace()=%p fnd=%p\n", - // mmd->getNamespace(),fnd); - if (mmd->getNamespace()==fnd && + //printf("mmd->getNamespaceDef()=%p fnd=%p\n", + // mmd->getNamespaceDef(),fnd); + if (mmd->getNamespaceDef()==fnd && //(mmd->isReference() || mmd->hasDocumentation()) mmd->isLinkable() ) @@ -1630,7 +1636,7 @@ bool getDefs(const QCString &scName,const QCString &memberName, // the first defined! while (mmd && !found) { - if (mmd->getNamespace()==fnd && + if (mmd->getNamespaceDef()==fnd && //(mmd->isReference() || mmd->hasDocumentation()) mmd->isLinkable() ) @@ -1646,14 +1652,14 @@ bool getDefs(const QCString &scName,const QCString &memberName, } else // no scope => global function { - //printf("Function with global scope `%s'\n",namespaceName.data()); + //printf("Function with global scope `%s' args=`%s'\n",namespaceName.data(),args); md=mn->first(); while (md) { if (md->isLinkable()) { fd=md->getFileDef(); - gd=md->groupDef(); + gd=md->getGroupDef(); //printf("md->name()=`%s' md->args=`%s' fd=%p gd=%p\n", // md->name().data(),args,fd,gd); bool inGroup=FALSE; @@ -1688,13 +1694,14 @@ bool getDefs(const QCString &scName,const QCString &memberName, md=mn->last(); while (md) { - if (md->isLinkable()) + //printf("Found member `%s'\n",md->name().data()); + if (1 /* md->isLinkable() */) { - //printf("md->name()=`%s'\n",md->name().data()); + //printf("member is linkable md->name()=`%s'\n",md->name().data()); fd=md->getFileDef(); - gd=md->groupDef(); + gd=md->getGroupDef(); bool inGroup=FALSE; - if ((fd && fd->isLinkable()) |+ + if ((fd && fd->isLinkable()) || (inGroup=(gd && gd->isLinkable())) ) { |