From 0c394c5817041713aee58748fcd5d338a467cbee Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Sat, 7 Jun 2003 11:47:47 +0000 Subject: Release-1.3.1-20030607 --- INSTALL | 4 +- README | 4 +- VERSION | 2 +- doc/commands.doc | 35 +++++ doc/config.doc | 47 ++++--- doc/faq.doc | 5 + doc/language.doc | 2 +- packages/rpm/doxygen.spec | 2 +- src/classdef.cpp | 1 + src/cmdmapper.cpp | 2 + src/cmdmapper.h | 94 ++++++------- src/code.l | 18 ++- src/config.l | 62 ++++++--- src/docparser.cpp | 39 +++++- src/docparser.h | 2 +- src/doctokenizer.h | 1 + src/doctokenizer.l | 19 +++ src/dot.cpp | 339 +++++++++++++++++++++++++++++++++++++++++----- src/dot.h | 23 +++- src/doxygen.cpp | 30 +++- src/doxygen.h | 1 + src/entry.cpp | 2 + src/entry.h | 3 +- src/filedef.cpp | 27 ++++ src/filedef.h | 1 + src/ftvhelp.cpp | 16 ++- src/htmldocvisitor.cpp | 1 + src/htmlgen.cpp | 9 ++ src/htmlgen.h | 2 + src/index.cpp | 12 +- src/latexdocvisitor.cpp | 5 +- src/latexgen.cpp | 9 ++ src/latexgen.h | 2 + src/mandocvisitor.cpp | 3 +- src/mangen.h | 2 + src/memberdef.cpp | 25 ++++ src/memberdef.h | 5 + src/outputgen.h | 3 + src/outputlist.cpp | 18 ++- src/outputlist.h | 5 + src/perlmodgen.cpp | 1 + src/pre.l | 10 +- src/rtfdocvisitor.cpp | 3 +- src/rtfgen.cpp | 21 +++ src/rtfgen.h | 2 + src/scanner.l | 41 +++++- src/translator_fr.h | 257 +++++++++++++++++------------------ src/util.cpp | 7 + src/xmldocvisitor.cpp | 3 + 49 files changed, 933 insertions(+), 294 deletions(-) diff --git a/INSTALL b/INSTALL index df5496b..dfd713a 100644 --- a/INSTALL +++ b/INSTALL @@ -1,7 +1,7 @@ -DOXYGEN Version 1.3.1 +DOXYGEN Version 1.3.1-20030607 Please read the installation section of the manual (http://www.doxygen.org/install.html) for instructions. -------- -Dimitri van Heesch (28 May 2003) +Dimitri van Heesch (07 June 2003) diff --git a/README b/README index 70e274a..44cbc5e 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -DOXYGEN Version 1.3.1 +DOXYGEN Version 1.3.1_20030607 Please read INSTALL for compilation instructions. @@ -17,4 +17,4 @@ to subscribe to the lists or to visit the archives. Enjoy, -Dimitri van Heesch (dimitri@stack.nl) (28 May 2003) +Dimitri van Heesch (dimitri@stack.nl) (07 June 2003) diff --git a/VERSION b/VERSION index 3a3cd8c..0843be3 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -1.3.1 +1.3.1-20030607 diff --git a/doc/commands.doc b/doc/commands.doc index 4557bb3..d7ba4f3 100644 --- a/doc/commands.doc +++ b/doc/commands.doc @@ -47,6 +47,7 @@ documentation: \refitem cmdbrief \\brief \refitem cmdbug \\bug \refitem cmdc \\c +\refitem cmdcallgraph \\callgraph \refitem cmdclass \\class \refitem cmdcode \\code \refitem cmdcopydoc \\copydoc @@ -66,6 +67,7 @@ documentation: \refitem cmdendlatexonly \\endlatexonly \refitem cmdendlink \\endlink \refitem cmdendverbatim \\endverbatim +\refitem cmdendxmlonly \\endxmlonly \refitem cmdenum \\enum \refitem cmdexample \\example \refitem cmdexception \\exception @@ -129,6 +131,7 @@ documentation: \refitem cmdversion \\version \refitem cmdwarning \\warning \refitem cmdweakgroup \\weakgroup +\refitem cmdxmlonly \\xmlonly \refitem cmdxrefitem \\xrefitem \refitem cmddollar \\\$ \refitem cmdat \\\@ @@ -181,6 +184,17 @@ doxygen. Unrecognized commands are treated as normal text. \sa page \ref grouping "Grouping", sections \ref cmddefgroup "\\defgroup", \ref cmdingroup "\\ingroup" and \ref cmdweakgroup "\\weakgroup". +\section cmdcallgraph \callgraph + + \addindex \\callgraph + When this command is put in a comment block of a function or method + and \ref cfg_have_dot "HAVE_DOT" is set to YES, then doxygen will + generate a call graph for that function (provided the implementation of the + function or method calls other documented functions). The call graph will + generated regardless of the value of \ref cfg_call_graph "CALL_GRAPH". + \note The completeness (and correctness) of the call graph depends on the + doxygen code parser which is not perfect. + \section cmdclass \class [] [] \addindex \\class @@ -1552,6 +1566,14 @@ ALIASES = "english=\if english" \ \sa section \ref cmdverbatim "\\verbatim".
+\section cmdendxmlonly \endxmlonly + + \addindex \\endxmlonly + Ends a block of text that was started with a \\xmlonly command. + + \sa section \ref cmdxmlonly "\\xmlonly". + +
\section cmdfdollar \f$ \addindex \\f\$ @@ -1741,6 +1763,19 @@ ALIASES = "english=\if english" \ \\verbatim command or the parser will get confused!
+\section cmdxmlonly \xmlonly + + \addindex \\xmlonly + Starts a block of text that will be verbatim included in the + generated XML output only. The block ends with a + endxmlonly command. + + This command can be used to include custom XML tags. + + \sa section \ref cmdhtmlonly "\\htmlonly" and section + \ref cmdlatexonly "\\latexonly". + +
\section cmdbackslash \\ \addindex \\\\ diff --git a/doc/config.doc b/doc/config.doc index f5d2d50..b86d145 100644 --- a/doc/config.doc +++ b/doc/config.doc @@ -62,6 +62,7 @@ followed by the descriptions of the tags grouped by category. \refitem cfg_bin_abspath BIN_ABSPATH \refitem cfg_binary_toc BINARY_TOC \refitem cfg_brief_member_desc BRIEF_MEMBER_DESC +\refitem cfg_call_graph CALL_GRAPH \refitem cfg_case_sense_names CASE_SENSE_NAMES \refitem cfg_cgi_name CGI_NAME \refitem cfg_cgi_url CGI_URL @@ -242,7 +243,8 @@ followed by the descriptions of the tags grouped by category. The default language is English, other supported languages are: Brazilian, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, - Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish and Swedish. + Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, + and Ukrainian. \anchor cfg_use_windows_encoding
\c USE_WINDOWS_ENCODING
@@ -251,8 +253,8 @@ followed by the descriptions of the tags grouped by category. The encoding is not always determined by the language that is chosen, but also whether or not the output is meant for Windows or non-Windows users. In case there is a difference, setting the \c USE_WINDOWS_ENCODING tag to \c YES - forces the Windows enconding, (this is the default for the Windows binary), - whereas setting the tag to \c NO uses a Unix-style encoding (the default for the + forces the Windows encoding, (this is the default for the Windows binary), + whereas setting the tag to \c NO uses a Unix-style encoding (the default for all platforms other than Windows). \anchor cfg_extract_all @@ -366,7 +368,7 @@ function's detailed documentation block.
\c STRIP_FROM_PATH
\addindex STRIP_FROM_PATH If the \c FULL_PATH_NAMES tag is set to \c YES then the \c STRIP_FROM_PATH tag - can be used to strip a user defined part of the path. Stripping is + can be used to strip a user-defined part of the path. Stripping is only done if one of the specified strings matches the left-hand part of the path. @@ -382,8 +384,8 @@ function's detailed documentation block.
\c CASE_SENSE_NAMES
\addindex CASE_SENSE_NAMES If the \c CASE_SENSE_NAMES tag is set to \c NO (the default) then doxygen - will only generate file names in lower case letters. If set to - \c YES upper case letters are also allowed. This is useful if you have + will only generate file names in lower-case letters. If set to + \c YES upper-case letters are also allowed. This is useful if you have classes or files whose names only differ in case and if your file system supports case sensitive file names. @@ -413,7 +415,7 @@ function's detailed documentation block.
\c SHOW_INCLUDE_FILES
\addindex SHOW_INCLUDE_FILES If the SHOW_INCLUDE_FILES tag is set to YES (the default) then doxygen - will put list of the files that are included by a file in the documentation + will put a list of the files that are included by a file in the documentation of that file. \anchor cfg_javadoc_autobrief @@ -529,7 +531,7 @@ function's detailed documentation block. \endverbatim will allow you to put the command \\sideeffect (or \@sideeffect) in the documentation, which - will result in a user defined paragraph with heading "Side Effects:". + will result in a user-defined paragraph with heading "Side Effects:". You can put \\n's in the value part of an alias to insert newlines. \anchor cfg_max_initializer_lines @@ -547,7 +549,7 @@ function's detailed documentation block. \addindex OPTIMIZE_OUTPUT_FOR_C Set the \c OPTIMIZE_OUTPUT_FOR_C tag to \c YES if your project consists of C sources only. Doxygen will then generate output that is more tailored - for C. For instance some of the names that are used will be different. + for C. For instance, some of the names that are used will be different. The list of all members will be omitted, etc. \anchor cfg_optimize_output_java @@ -555,7 +557,7 @@ function's detailed documentation block. \addindex OPTIMIZE_OUTPUT_JAVA Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources only. Doxygen will then generate output that is more tailored for Java. - For instance namespaces will be presented as packages, qualified scopes + For instance, namespaces will be presented as packages, qualified scopes will look different, etc. \anchor cfg_show_used_files @@ -816,7 +818,7 @@ function's detailed documentation block. \anchor cfg_html_header
\c HTML_HEADER
\addindex HTML_HEADER - The \c HTML_HEADER tag can be used to specify a user defined HTML + 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 \ and a \c \ tag, but it is good idea to include the style sheet that is generated by doxygen as well. @@ -847,7 +849,7 @@ function's detailed documentation block. \anchor cfg_html_footer
\c HTML_FOOTER
\addindex HTML_FOOTER - The \c HTML_FOOTER tag can be used to specify a user defined HTML footer for + 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 \ and a \c \ tag. A minimal example: \verbatim @@ -871,7 +873,7 @@ function's detailed documentation block. \anchor cfg_html_stylesheet
\c HTML_STYLESHEET
\addindex HTML_STYLESHEET - The \c HTML_STYLESHEET tag can be used to specify a user defined cascading + 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. @@ -924,7 +926,7 @@ function's detailed documentation block. If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c HHC_LOCATION tag can be used to specify the location (absolute path including file name) of the HTML help compiler (hhc.exe). If non empty doxygen will try to run - the html help compiler on the generated index.hhp. + the HTML help compiler on the generated index.hhp. \anchor cfg_generate_chi
\c GENERATE_CHI
@@ -1053,7 +1055,7 @@ EXTRA_PACKAGES = times 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! + Only use a user-defined header if you know what you are doing! The following commands have a special meaning inside the header: \$title, \$datetime, \$date, @@ -1409,7 +1411,7 @@ TAGFILES = file1=loc1 "file2 = loc2" ... If the \c CLASS_DIAGRAMS tag is set to \c YES (the default) doxygen will generate a class diagram (in HTML and \f$\mbox{\LaTeX}\f$) for classes with base or super classes. Setting the tag to \c NO turns the diagrams off. - Note that this option is superceded by the HAVE_DOT option below. + Note that this option is superseded by the HAVE_DOT option below. This is only a fallback. It is recommended to install and use dot, since it yield more powerful graphs. @@ -1467,6 +1469,15 @@ TAGFILES = file1=loc1 "file2 = loc2" ... documented header file showing the documented files that directly or indirectly include this file. +\anchor cfg_call_graph +
\c CALL_GRAPH
+ \addindex CALL_GRAPH + If the \c CALL_GRAPH and \c HAVE_DOT tags are set to \c YES then doxygen will + generate a call dependency graph for every global function or class method. + Note that enabling this option will significantly increase the time of a run. + So in most cases it will be better to enable call graphs for selected + functions only using the \\callgraph command. + \anchor cfg_graphical_hierarchy
\c GRAPHICAL_HIERARCHY
\addindex GRAPHICAL_HIERARCHY @@ -1515,7 +1526,7 @@ not sufficient to fit the graph (see \ref cfg_max_dot_graph_width "MAX_DOT_GRAPH_WIDTH" and \ref cfg_max_dot_graph_height "MAX_DOT_GRAPH_HEIGHT"). If 0 is used fot the depth value (the default), the graph is -not depth constraint. +not depth-constraint. \anchor cfg_max_dot_graph_width
\c MAX_DOT_GRAPH_WIDTH
@@ -1537,7 +1548,7 @@ not depth constraint.
\c DOT_CLEANUP
\addindex DOT_CLEANUP If the \c DOT_CLEANUP tag is set to \c YES (the default) doxygen will -remove the intermedate dot files that are used to generate the various graphs. +remove the intermediate dot files that are used to generate the various graphs. diff --git a/doc/faq.doc b/doc/faq.doc index 5459573..74dc805 100644 --- a/doc/faq.doc +++ b/doc/faq.doc @@ -222,6 +222,11 @@ should send me a code fragment that triggers the message. The workaround the problem put some line-breaks into your file, split it up into smaller parts, or exclude it from the input using EXCLUDE. +
  • When running make in the latex dir I get "TeX capacity exceeded". Now what? + +You can edit the texmf.cfg file to increase the default values of the +various buffers and then run "texconfig init". +
  • Why are dependencies via STL classes not shown in the dot graphs? Doxygen is unware of the STL classes, so it does not know that class A relates diff --git a/doc/language.doc b/doc/language.doc index bb6cc00..5525e56 100644 --- a/doc/language.doc +++ b/doc/language.doc @@ -25,7 +25,7 @@ Doxygen has built-in support for multiple languages. This means that the text fragments that doxygen generates can be produced in languages other than English (the default) at configuration time. -Currently (version 1.3-20030430), 28 languages +Currently (version 1.3.1), 28 languages are supported (sorted alphabetically): Brazilian Portuguese, Catalan, Chinese, Chinese Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec index e1ff86c..ca0232c 100644 --- a/packages/rpm/doxygen.spec +++ b/packages/rpm/doxygen.spec @@ -1,6 +1,6 @@ Summary: A documentation system for C/C++. Name: doxygen -Version: 1.3.1 +Version: 1.3.1_20030607 Release: 1 Epoch: 1 Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz diff --git a/src/classdef.cpp b/src/classdef.cpp index 2cce6aa..0bbaf84 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -92,6 +92,7 @@ ClassDef::ClassDef( m_membersMerged = FALSE; QCString ns; extractNamespaceName(m_name,m_className,ns); + //printf("m_name=%s m_className=%s ns=%s\n",m_name.data(),m_className.data(),ns.data()); if (((QCString)defFileName).right(5)!=".java" && guessSection(defFileName)==Entry::SOURCE_SEC) diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp index 41fda43..f06c6f1 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -41,6 +41,7 @@ CommandMap cmdMap[] = { "endlink", CMD_ENDLINK }, { "endsecreflist", CMD_ENDSECREFLIST }, { "endverbatim", CMD_ENDVERBATIM }, + { "endxmlonly", CMD_ENDXMLONLY }, { "exception", CMD_EXCEPTION }, { "form", CMD_FORMULA }, { "htmlinclude", CMD_HTMLINCLUDE }, @@ -79,6 +80,7 @@ CommandMap cmdMap[] = { "since", CMD_SINCE }, { "skip", CMD_SKIP }, { "skipline", CMD_SKIPLINE }, + { "xmlonly", CMD_XMLONLY }, { "xrefitem", CMD_XREFITEM }, { "throw", CMD_EXCEPTION }, { "until", CMD_UNTIL }, diff --git a/src/cmdmapper.h b/src/cmdmapper.h index c5cf2ab..7623348 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -54,52 +54,54 @@ enum CommandType CMD_ENDLINK = 20, CMD_ENDSECREFLIST= 21, CMD_ENDVERBATIM = 22, - CMD_EXCEPTION = 23 | SIMPLESECT_BIT, - CMD_FORMULA = 24, - CMD_GREATER = 25, - CMD_HASH = 26, - CMD_HTMLINCLUDE = 27, - CMD_HTMLONLY = 28, - CMD_IMAGE = 29, - CMD_INCLUDE = 30, - CMD_INTERNAL = 31, - CMD_INTERNALREF = 32, - CMD_INVARIANT = 33 | SIMPLESECT_BIT , - CMD_LANGSWITCH = 34, - CMD_LATEXONLY = 35, - CMD_LESS = 36, - CMD_LI = 37, - CMD_LINE = 38, - CMD_LINEBREAK = 39, - CMD_LINK = 40, - CMD_NOTE = 41 | SIMPLESECT_BIT, - CMD_PAR = 42 | SIMPLESECT_BIT, - CMD_PARAM = 43 | SIMPLESECT_BIT, - CMD_PERCENT = 44, - CMD_POST = 45 | SIMPLESECT_BIT, - CMD_PRE = 46 | SIMPLESECT_BIT , - CMD_REF = 47, - CMD_SECREFITEM = 48, - CMD_REMARK = 49 | SIMPLESECT_BIT , - CMD_RETURN = 50 | SIMPLESECT_BIT , - CMD_RETVAL = 51 | SIMPLESECT_BIT, - CMD_SA = 52 | SIMPLESECT_BIT , - CMD_SECREFLIST = 53, - CMD_SECTION = 54, - CMD_SUBSECTION = 55, - CMD_SUBSUBSECTION= 56, - CMD_PARAGRAPH = 57, - CMD_SINCE = 58 | SIMPLESECT_BIT, - CMD_SKIP = 59, - CMD_SKIPLINE = 60, - CMD_STARTCODE = 61, - CMD_JAVALINK = 62, - CMD_UNTIL = 63, - CMD_VERBATIM = 64, - CMD_VERBINCLUDE = 65, - CMD_VERSION = 66 | SIMPLESECT_BIT, - CMD_WARNING = 67 | SIMPLESECT_BIT, - CMD_XREFITEM = 68 | SIMPLESECT_BIT + CMD_ENDXMLONLY = 23, + CMD_EXCEPTION = 24 | SIMPLESECT_BIT, + CMD_FORMULA = 25, + CMD_GREATER = 26, + CMD_HASH = 27, + CMD_HTMLINCLUDE = 28, + CMD_HTMLONLY = 29, + CMD_IMAGE = 30, + CMD_INCLUDE = 31, + CMD_INTERNAL = 32, + CMD_INTERNALREF = 33, + CMD_INVARIANT = 34 | SIMPLESECT_BIT , + CMD_LANGSWITCH = 35, + CMD_LATEXONLY = 36, + CMD_LESS = 37, + CMD_LI = 38, + CMD_LINE = 39, + CMD_LINEBREAK = 40, + CMD_LINK = 41, + CMD_NOTE = 42 | SIMPLESECT_BIT, + CMD_PAR = 43 | SIMPLESECT_BIT, + CMD_PARAM = 44 | SIMPLESECT_BIT, + CMD_PERCENT = 45, + CMD_POST = 46 | SIMPLESECT_BIT, + CMD_PRE = 47 | SIMPLESECT_BIT , + CMD_REF = 48, + CMD_SECREFITEM = 49, + CMD_REMARK = 50 | SIMPLESECT_BIT , + CMD_RETURN = 51 | SIMPLESECT_BIT , + CMD_RETVAL = 52 | SIMPLESECT_BIT, + CMD_SA = 53 | SIMPLESECT_BIT , + CMD_SECREFLIST = 54, + CMD_SECTION = 55, + CMD_SUBSECTION = 56, + CMD_SUBSUBSECTION= 57, + CMD_PARAGRAPH = 58, + CMD_SINCE = 59 | SIMPLESECT_BIT, + CMD_SKIP = 60, + CMD_SKIPLINE = 61, + CMD_STARTCODE = 62, + CMD_JAVALINK = 63, + CMD_UNTIL = 64, + CMD_VERBATIM = 65, + CMD_VERBINCLUDE = 66, + CMD_VERSION = 67 | SIMPLESECT_BIT, + CMD_WARNING = 68 | SIMPLESECT_BIT, + CMD_XREFITEM = 69 | SIMPLESECT_BIT, + CMD_XMLONLY = 70 }; enum HtmlTagType diff --git a/src/code.l b/src/code.l index e303139..09fe71b 100644 --- a/src/code.l +++ b/src/code.l @@ -1224,8 +1224,6 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" g_scopeStack.push(SCOPEBLOCK); pushScope(g_curClassName); //printf("***** g_curClassName=%s\n",g_curClassName.data()); - //CodeClassDef *cd=new CodeClassDef(g_ccd); - //g_codeClassDict.insert(cd->name,cd); if (getResolvedClass(g_currentDefinition,g_curClassName)==0) { g_curClassDef=new ClassDef("",1, @@ -1611,9 +1609,6 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" BEGIN( SkipInits ); } } - /* -")"({BN}"const"|"volatile")*{BN}*"{" { - */ ({BN}"const"|"volatile")*{BN}*"{" { if (g_insideBody) { @@ -1622,10 +1617,19 @@ TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned" g_theVarContext.addVariable(g_parmType,g_parmName); g_theCallContext.popScope(); g_parmType.resize(0);g_parmName.resize(0); - if (g_name.find("::")!=-1) + int index = g_name.findRev("::"); + if (index!=-1) { + ClassDef *cd=getResolvedClass(Doxygen::globalScope,g_name.left(index)); + if (cd) + { + setClassScope(cd->name()); + } + else + { + setClassScope(g_realScope); + } g_scopeStack.push(SCOPEBLOCK); - setClassScope(g_realScope); } else { diff --git a/src/config.l b/src/config.l index 7933eee..03119c0 100644 --- a/src/config.l +++ b/src/config.l @@ -1288,8 +1288,8 @@ void Config::create() "The default language is English, other supported languages are: \n" "Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, \n" "Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en \n" - "(Japanese with english messages), Korean, Norwegian, Polish, Portuguese, \n" - "Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish and Ukrainian.\n", + "(Japanese with English messages), Korean, Norwegian, Polish, Portuguese, \n" + "Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.\n", "English" ); #ifdef LANG_BR @@ -1381,8 +1381,8 @@ void Config::create() "The encoding is not always determined by the language that is chosen, \n" "but also whether or not the output is meant for Windows or non-Windows users. \n" "In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES \n" - "forces the Windows enconding, (this is the default for the Windows binary), \n" - "whereas setting the tag to NO uses a Unix-style encoding (the default for the \n" + "forces the Windows encoding (this is the default for the Windows binary), \n" + "whereas setting the tag to NO uses a Unix-style encoding (the default for \n" "all platforms other than Windows).\n", #if defined(_WIN32) || defined(__CYGWIN__) TRUE @@ -1430,7 +1430,7 @@ void Config::create() "HIDE_UNDOC_CLASSES", "If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all \n" "undocumented classes that are normally visible in the class hierarchy. \n" - "If set to NO (the default) these class will be included in the various \n" + "If set to NO (the default) these classes will be included in the various \n" "overviews. This option has no effect if EXTRACT_ALL is enabled. \n", FALSE ); @@ -1491,7 +1491,7 @@ void Config::create() cl = addList( "STRIP_FROM_PATH", "If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag \n" - "can be used to strip a user defined part of the path. Stripping is \n" + "can be used to strip a user-defined part of the path. Stripping is \n" "only done if one of the specified strings matches the left-hand part of \n" "the path. It is allowed to use relative paths in the argument list.\n" ); @@ -1507,10 +1507,10 @@ void Config::create() cb = addBool( "CASE_SENSE_NAMES", "If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate \n" - "file names in lower case letters. If set to YES upper case letters are also \n" + "file names in lower-case letters. If set to YES upper-case letters are also \n" "allowed. This is useful if you have classes or files whose names only differ \n" "in case and if your file system supports case sensitive file names. Windows \n" - "users are adviced to set this option to NO.\n", + "users are advised to set this option to NO.\n", TRUE ); cb = addBool( @@ -1530,7 +1530,7 @@ void Config::create() cb = addBool( "SHOW_INCLUDE_FILES", "If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen \n" - "will put list of the files that are included by a file in the documentation \n" + "will put a list of the files that are included by a file in the documentation \n" "of that file. \n", TRUE ); @@ -1539,7 +1539,7 @@ void Config::create() "If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen \n" "will interpret the first line (until the first dot) of a JavaDoc-style \n" "comment as the brief description. If set to NO, the JavaDoc \n" - "comments will behave just like the Qt-style comments (thus requiring an \n" + "comments will behave just like the Qt-style comments (thus requiring an \n" "explict @brief command for a brief description. \n", FALSE ); @@ -1629,7 +1629,7 @@ void Config::create() "as commands in the documentation. An alias has the form \"name=value\". \n" "For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to \n" "put the command \\sideeffect (or @sideeffect) in the documentation, which \n" - "will result in a user defined paragraph with heading \"Side Effects:\". \n" + "will result in a user-defined paragraph with heading \"Side Effects:\". \n" "You can put \\n's in the value part of an alias to insert newlines. \n" ); cl = addList( @@ -1640,7 +1640,7 @@ void Config::create() ci = addInt( "MAX_INITIALIZER_LINES", "The MAX_INITIALIZER_LINES tag determines the maximum number of lines \n" - "the initial value of a variable or define consist of for it to appear in \n" + "the initial value of a variable or define consists of for it to appear in \n" "the documentation. If the initializer consists of more lines than specified \n" "here it will be hidden. Use a value of 0 to hide initializers completely. \n" "The appearance of the initializer of individual variables and defines in the \n" @@ -1652,7 +1652,7 @@ void Config::create() "OPTIMIZE_OUTPUT_FOR_C", "Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources \n" "only. Doxygen will then generate output that is more tailored for C. \n" - "For instance some of the names that are used will be different. The list \n" + "For instance, some of the names that are used will be different. The list \n" "of all members will be omitted, etc. \n", FALSE ); @@ -1660,7 +1660,7 @@ void Config::create() "OPTIMIZE_OUTPUT_JAVA", "Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources \n" "only. Doxygen will then generate output that is more tailored for Java. \n" - "For instance namespaces will be presented as packages, qualified scopes \n" + "For instance, namespaces will be presented as packages, qualified scopes \n" "will look different, etc. \n", FALSE ); @@ -1921,7 +1921,7 @@ void Config::create() cs->addDependency("GENERATE_HTML"); cs = addString( "HTML_STYLESHEET", - "The HTML_STYLESHEET tag can be used to specify a user defined cascading \n" + "The HTML_STYLESHEET tag can be used to specify a user-defined cascading \n" "style sheet that is used by each HTML page. It can be used to \n" "fine-tune the look of the HTML output. If the tag is left blank doxygen \n" "will generate a default style sheet \n" @@ -1957,8 +1957,8 @@ void Config::create() "HHC_LOCATION", "If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can \n" "be used to specify the location (absolute path including file name) of \n" - "the HTML help compiler (hhc.exe). If non empty doxygen will try to run \n" - "the html help compiler on the generated index.hhp.\n" + "the HTML help compiler (hhc.exe). If non-empty doxygen will try to run \n" + "the HTML help compiler on the generated index.hhp.\n" ); cs->addDependency("GENERATE_HTML"); cb = addBool( @@ -1980,7 +1980,7 @@ void Config::create() cb = addBool( "TOC_EXPAND", "The TOC_EXPAND flag can be set to YES to add extra items for group members \n" - "to the contents of the Html help documentation and to the tree view. \n", + "to the contents of the HTML help documentation and to the tree view. \n", FALSE ); cb->addDependency("GENERATE_HTML"); @@ -2431,9 +2431,9 @@ void Config::create() cb = addBool( "CLASS_DIAGRAMS", "If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will \n" - "generate a inheritance diagram (in Html, RTF and LaTeX) for classes with base or \n" + "generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or \n" "super classes. Setting the tag to NO turns the diagrams off. Note that this \n" - "option is superceded by the HAVE_DOT option below. This is only a fallback. It is \n" + "option is superseded by the HAVE_DOT option below. This is only a fallback. It is \n" "recommended to install and use dot, since it yield more powerful graphs. \n", TRUE ); @@ -2471,6 +2471,14 @@ void Config::create() ); cb->addDependency("HAVE_DOT"); cb = addBool( + "UML_LOOK", + "If the UML_LOOK tag is set to YES doxygen will generate inheritance and \n" + "colloborations diagrams in a style similiar to the OMG's Unified Modeling \n" + "Language. \n", + FALSE + ); + cb->addDependency("HAVE_DOT"); + cb = addBool( "TEMPLATE_RELATIONS", "If set to YES, the inheritance and collaboration graphs will show the \n" "relations between templates and their instances. \n", @@ -2496,6 +2504,16 @@ void Config::create() ); cb->addDependency("HAVE_DOT"); cb = addBool( + "CALL_GRAPH", + "If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will \n" + "generate a call dependency graph for every global function or class method. \n" + "Note that enabling this option will significantly increase the time of a run. \n" + "So in most cases it will be better to enable call graphs for selected \n" + "functions only using the \\callgraph command.\n", + FALSE + ); + cb->addDependency("HAVE_DOT"); + cb = addBool( "GRAPHICAL_HIERARCHY", "If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen \n" "will graphical hierarchy of all classes instead of a textual one. \n", @@ -2556,7 +2574,7 @@ void Config::create() "1 or 2 may greatly reduce the computation time needed for large code bases. Also \n" "note that a graph may be further truncated if the graph's image dimensions are \n" "not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT). \n" - "If 0 is used fot the depth value (the default), the graph is not depth constraint. \n", + "If 0 is used for the depth value (the default), the graph is not depth-constrained. \n", 0,1000,0 ); ci->addDependency("HAVE_DOT"); @@ -2571,7 +2589,7 @@ void Config::create() cb = addBool( "DOT_CLEANUP", "If the DOT_CLEANUP tag is set to YES (the default) Doxygen will \n" - "remove the intermedate dot files that are used to generate \n" + "remove the intermediate dot files that are used to generate \n" "the various graphs. \n", TRUE ); diff --git a/src/docparser.cpp b/src/docparser.cpp index 822f530..f69a0c9 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -826,6 +826,15 @@ reparsetoken: doctokenizerYYsetStatePara(); } break; + case CMD_XMLONLY: + { + doctokenizerYYsetStateXmlOnly(); + tok = doctokenizerYYlex(); + children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::XmlOnly,g_isExample,g_exampleName)); + if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: xmlonly section ended without end marker",doctokenizerYYlineno); + doctokenizerYYsetStatePara(); + } + break; case CMD_FORMULA: { DocFormula *form=new DocFormula(parent,g_token->id); @@ -3043,7 +3052,8 @@ int DocParamList::parse(const QString &cmdName) { warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected end of comment block while parsing the " "argument of command %s",cmdName.data()); - return 0; + retval=0; + goto endparamlist; } ASSERT(tok==TK_WHITESPACE); @@ -3051,6 +3061,7 @@ int DocParamList::parse(const QString &cmdName) m_paragraph->markFirst(); m_paragraph->markLast(); +endparamlist: DBG(("DocParamList::parse() end retval=%d\n",retval)); DocNode *n=g_nodeStack.pop(); ASSERT(n==this); @@ -3588,6 +3599,15 @@ int DocPara::handleCommand(const QString &cmdName) doctokenizerYYsetStatePara(); } break; + case CMD_XMLONLY: + { + doctokenizerYYsetStateXmlOnly(); + retval = doctokenizerYYlex(); + m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::XmlOnly,g_isExample,g_exampleName)); + if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: xmlonly section ended without end marker"); + doctokenizerYYsetStatePara(); + } + break; case CMD_VERBATIM: { doctokenizerYYsetStateVerbatim(); @@ -3600,6 +3620,7 @@ int DocPara::handleCommand(const QString &cmdName) case CMD_ENDCODE: case CMD_ENDHTMLONLY: case CMD_ENDLATEXONLY: + case CMD_ENDXMLONLY: case CMD_ENDLINK: case CMD_ENDVERBATIM: warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected command %s",g_token->name.data()); @@ -4491,6 +4512,9 @@ int DocSection::parse() retval=0; // stop parsing } + else + { + } INTERNAL_ASSERT(retval==0 || retval==RetVal_Section || @@ -4615,6 +4639,18 @@ void DocRoot::parse() { warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Invalid list item found"); } + else if (retval==RetVal_Subsection) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found subsection command outside of section context!"); + } + else if (retval==RetVal_Subsubsection) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found subsubsection command outside of subsection context!"); + } + else if (retval==RetVal_Paragraph) + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found paragraph command outside of subsubsection context!"); + } } while (retval!=0 && retval!=RetVal_Section && retval!=RetVal_Internal); if (lastPar) lastPar->markLast(); @@ -4642,6 +4678,7 @@ void DocRoot::parse() retval = in->parse(); } + handleUnclosedStyleCommands(); DocNode *n = g_nodeStack.pop(); diff --git a/src/docparser.h b/src/docparser.h index ca9e82e..0c5a599 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -351,7 +351,7 @@ class DocWhiteSpace : public DocNode class DocVerbatim : public DocNode { public: - enum Type { Code, HtmlOnly, LatexOnly, Verbatim }; + enum Type { Code, HtmlOnly, LatexOnly, XmlOnly, Verbatim }; DocVerbatim(DocNode *parent,const QString &context, const QString &text, Type t,bool isExample, const QString &exampleFile) : diff --git a/src/doctokenizer.h b/src/doctokenizer.h index ead3a3f..6c62815 100644 --- a/src/doctokenizer.h +++ b/src/doctokenizer.h @@ -121,6 +121,7 @@ void doctokenizerYYsetStateTitle(); void doctokenizerYYsetStateCode(); void doctokenizerYYsetStateHtmlOnly(); void doctokenizerYYsetStateLatexOnly(); +void doctokenizerYYsetStateXmlOnly(); void doctokenizerYYsetStateVerbatim(); void doctokenizerYYsetStateParam(); void doctokenizerYYsetStateXRefItem(); diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 395cd81..b86a1dd 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -306,6 +306,7 @@ LABELID [a-z_A-Z][a-z_A-Z0-9\-]* %x St_Code %x St_HtmlOnly %x St_LatexOnly +%x St_XmlOnly %x St_Verbatim %x St_Param %x St_XRefItem @@ -507,6 +508,14 @@ LABELID [a-z_A-Z][a-z_A-Z0-9\-]* . { g_token->verb+=yytext; } +{CMD}"endxmlonly" { + return RetVal_OK; + } +[^\\@\n]+ | +\n | +. { + g_token->verb+=yytext; + } {CMD}"endverbatim" { return RetVal_OK; } @@ -742,6 +751,10 @@ LABELID [a-z_A-Z][a-z_A-Z0-9\-]* g_endMarker="endlatexonly"; BEGIN(St_SecSkip); } +{CMD}"xmlonly" { + g_endMarker="endxmlonly"; + BEGIN(St_SecSkip); + } {CMD}"code" { g_endMarker="endcode"; BEGIN(St_SecSkip); @@ -850,6 +863,12 @@ void doctokenizerYYsetStateHtmlOnly() BEGIN(St_HtmlOnly); } +void doctokenizerYYsetStateXmlOnly() +{ + g_token->verb=""; + BEGIN(St_XmlOnly); +} + void doctokenizerYYsetStateLatexOnly() { g_token->verb=""; diff --git a/src/dot.cpp b/src/dot.cpp index e2af531..f9bd520 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -46,15 +46,15 @@ static const char *edgeColorMap[] = "orange" // template relation }; -//static const char *arrowStyle[] = -//{ -// "empty", // Public -// "empty", // Protected -// "empty", // Private -// "open", // "use" relation -// 0, // Undocumented -// 0 // template relation -//}; +static const char *arrowStyle[] = +{ + "empty", // Public + "empty", // Protected + "empty", // Private + "open", // "use" relation + 0, // Undocumented + 0 // template relation +}; static const char *edgeStyleMap[] = { @@ -418,8 +418,21 @@ static QCString convertLabel(const QCString &l) return result; } +static void writeBoxMemberList(QTextStream &t,char prot,MemberList &ml,ClassDef *scope) +{ + MemberListIterator mlia(ml); + MemberDef *mma; + for (mlia.toFirst();(mma = mlia.current());++mlia) + { + if (mma->getClassDef() == scope) + { + t << prot << " " << convertLabel(mma->name()) << "\\l"; + } + } +} + void DotNode::writeBox(QTextStream &t, - GraphType /* gt */, + GraphType gt, GraphOutputFormat /*format*/, bool hasNonReachableChildren) { @@ -428,24 +441,65 @@ void DotNode::writeBox(QTextStream &t, ( (hasNonReachableChildren) ? "red" : "black" ); - t << " Node" << m_number << " [label=\"" - << convertLabel(m_label) - << "\",height=0.2,width=0.4"; - //if (format==BITMAP) t << ",fontname=\"Helvetica\""; - t << ",color=\"" << labCol << "\""; + t << " Node" << m_number << " [label=\""; + + if (Config_getBool("UML_LOOK") && (gt==Inheritance || gt==Collaboration)) + { + t << "{" << convertLabel(m_label); + t << "\\n|"; + writeBoxMemberList(t,'+',m_classDef->pubAttribs,m_classDef); + writeBoxMemberList(t,'+',m_classDef->pubStaticAttribs,m_classDef); + writeBoxMemberList(t,'~',m_classDef->pacAttribs,m_classDef); + writeBoxMemberList(t,'~',m_classDef->pacStaticAttribs,m_classDef); + writeBoxMemberList(t,'#',m_classDef->proAttribs,m_classDef); + writeBoxMemberList(t,'#',m_classDef->proStaticAttribs,m_classDef); + writeBoxMemberList(t,'-',m_classDef->priAttribs,m_classDef); + writeBoxMemberList(t,'-',m_classDef->priStaticAttribs,m_classDef); + t << "|"; + writeBoxMemberList(t,'+',m_classDef->pubMethods,m_classDef); + writeBoxMemberList(t,'+',m_classDef->pubStaticMethods,m_classDef); + writeBoxMemberList(t,'+',m_classDef->pubSlots,m_classDef); + writeBoxMemberList(t,'~',m_classDef->pacMethods,m_classDef); + writeBoxMemberList(t,'~',m_classDef->pacStaticMethods,m_classDef); + writeBoxMemberList(t,'#',m_classDef->proMethods,m_classDef); + writeBoxMemberList(t,'#',m_classDef->proStaticMethods,m_classDef); + writeBoxMemberList(t,'#',m_classDef->proSlots,m_classDef); + writeBoxMemberList(t,'-',m_classDef->priMethods,m_classDef); + writeBoxMemberList(t,'-',m_classDef->priStaticMethods,m_classDef); + writeBoxMemberList(t,'-',m_classDef->priSlots,m_classDef); + t << "}"; + } + else // old look + { + t << convertLabel(m_label); + } + t << "\",height=0.2,width=0.4"; if (m_isRoot) { - t << ",style=\"filled\" fontcolor=\"white\""; + t << ",color=\"white\", fillcolor=\"black\", style=\"filled\" fontcolor=\"white\""; } - else if (!m_url.isEmpty()) + else { - t << ",URL=\"" << m_url << Doxygen::htmlFileExtension << "\""; + t << ",color=\"" << labCol << "\""; + if (!m_url.isEmpty()) + { + int anchorPos = m_url.findRev('#'); + if (anchorPos==-1) + { + t << ",URL=\"" << m_url << Doxygen::htmlFileExtension << "\""; + } + else + { + t << ",URL=\"" << m_url.left(anchorPos) << Doxygen::htmlFileExtension + << m_url.right(m_url.length()-anchorPos) << "\""; + } + } } t << "];" << endl; } void DotNode::writeArrow(QTextStream &t, - GraphType /* gt */, + GraphType gt, GraphOutputFormat format, DotNode *cn, EdgeInfo *ei, @@ -465,10 +519,17 @@ void DotNode::writeArrow(QTextStream &t, { t << ",label=\"" << ei->m_label << "\""; } - //if (arrowStyle[ei->m_color]) - //{ - // if (pointBack) t << ",arrowtail=\"empty\""; else t << ",arrowhead=\"empty\""; - //} + if (Config_getBool("UML_LOOK") && + arrowStyle[ei->m_color] && + (gt==Inheritance || gt==Collaboration) + ) + { + if (pointBack) + t << ",arrowtail=\"" <m_color] << "\""; + else + t << ",arrowhead=\"" << arrowStyle[ei->m_color] << "\""; + } + if (format==BITMAP) t << ",fontname=\"Helvetica\""; t << "];" << endl; } @@ -1015,7 +1076,7 @@ DotGfxHierarchyTable::~DotGfxHierarchyTable() //-------------------------------------------------------------------- -int DotClassGraph::m_curNodeNumber; +int DotClassGraph::m_curNodeNumber = 0; void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot, const char *label,int distance,const char *usedName,const char *templSpec,bool base) @@ -1096,7 +1157,7 @@ void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base) // cd->name().data(),distance,base); // ---- Add inheritance relations - if (m_graphType == DotNode::Inheritance) + if (m_graphType == DotNode::Inheritance || m_graphType==DotNode::Collaboration) { BaseClassListIterator bcli(base ? *cd->baseClasses() : *cd->subClasses()); BaseClassDef *bcd; @@ -1108,10 +1169,8 @@ void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base) bcd->templSpecifiers,base); } } - else // m_graphType != Inheritance + if (m_graphType == DotNode::Collaboration) { - ASSERT(m_graphType==DotNode::Collaboration); - // ---- Add usage relations UsesClassDict *dict = @@ -1266,7 +1325,7 @@ void writeDotGraph(DotNode *root, t << " rankdir=LR;" << endl; } root->clearWriteFlag(); - root->write(t,gt,format,TRUE,TRUE,distance,backArrows); + root->write(t,gt,format,gt!=DotNode::CallGraph,TRUE,distance,backArrows); if (renderParents && root->m_parents) { //printf("rendering parents!\n"); @@ -1356,11 +1415,14 @@ static void findMaximalDotGraph(DotNode *root, } //printf("lastFit=%d\n",lastFit); + bool hasLRRank = (lrRank || (minDistance==1 && width>Config_getInt("MAX_DOT_GRAPH_WIDTH"))) && + !Config_getBool("UML_LOOK"); + writeDotGraph(root, gt, format, baseName, - lrRank || (minDistance==1 && width>Config_getInt("MAX_DOT_GRAPH_WIDTH")), + hasLRRank, renderParents, lastFit, backArrows @@ -1552,7 +1614,7 @@ void DotClassGraph::writeDEF(QTextStream &t) //-------------------------------------------------------------------- -int DotInclDepGraph::m_curNodeNumber; +int DotInclDepGraph::m_curNodeNumber = 0; void DotInclDepGraph::buildGraph(DotNode *n,FileDef *fd,int distance) { @@ -1784,6 +1846,221 @@ void DotInclDepGraph::writeXML(QTextStream &t) //------------------------------------------------------------- +int DotCallGraph::m_curNodeNumber = 0; + +DotCallGraph::DotCallGraph(MemberDef *md,int maxRecursionDepth) +{ + m_maxDistance = 0; + m_recDepth = maxRecursionDepth; + if (md->getGroupDef()) + { + m_diskName = md->getGroupDef()->getOutputFileBase()+"_"+md->getBodyAnchor(); + } + else + { + m_diskName = md->getOutputFileBase()+"_"+md->anchor(); + } + QCString uniqueId; + if (md->getGroupDef()) // member is in a group + { + uniqueId = md->getReference()+"$"+ + md->getGroupDef()->getOutputFileBase()+"#"+md->getBodyAnchor(); + } + else // ungrouped member + { + uniqueId = md->getReference()+"$"+ + md->getOutputFileBase()+"#"+md->anchor(); + } + m_startNode = new DotNode(m_curNodeNumber++, + md->qualifiedName(), + uniqueId.data(), + 0, // distance + TRUE // root node + ); + m_usedNodes = new QDict(1009); + m_usedNodes->insert(uniqueId,m_startNode); + buildGraph(m_startNode,md,1); +} + +DotCallGraph::~DotCallGraph() +{ + deleteNodes(m_startNode); + delete m_usedNodes; +} + +QCString DotCallGraph::writeGraph(QTextStream &out, GraphOutputFormat format, + const char *path,bool generateImageMap) +{ + QDir d(path); + // store the original directory + if (!d.exists()) + { + err("Error: Output dir %s does not exist!\n",path); exit(1); + } + QCString oldDir = convertToQCString(QDir::currentDirPath()); + // go to the html output directory (i.e. path) + QDir::setCurrent(d.absPath()); + QDir thisDir; + + QCString baseName=m_diskName+"_cgraph"; + //baseName=convertNameToFile(baseName); + QCString mapName=baseName; + + findMaximalDotGraph(m_startNode,QMIN(m_recDepth,m_maxDistance), + baseName,thisDir,DotNode::CallGraph,format, + TRUE,FALSE,FALSE); + + if (format==BITMAP) + { + // run dot to create a bitmap image + QCString dotArgs(maxCmdLine); + QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT"); + QCString imgName=baseName+"."+imgExt; + dotArgs.sprintf("-T%s \"%s.dot\" -o \"%s\"", + imgExt.data(),baseName.data(),imgName.data()); + if (iSystem(Config_getString("DOT_PATH")+"dot",dotArgs)!=0) + { + err("Problems running dot. Check your installation!\n"); + QDir::setCurrent(oldDir); + return baseName; + } + checkDotResult(imgName); + + if (generateImageMap) + { + // run dot again to create an image map + dotArgs.sprintf("-Timap \"%s.dot\" -o \"%s.map\"", + baseName.data(),baseName.data()); + if (iSystem(Config_getString("DOT_PATH")+"dot",dotArgs)!=0) + { + err("Problems running dot. Check your installation!\n"); + QDir::setCurrent(oldDir); + return baseName; + } + + out << "

    \"";"; + out << "
    " << endl; + QString tmpstr; + QTextOStream tmpout(&tmpstr); + convertMapFile(tmpout,baseName+".map"); + if (!tmpstr.isEmpty()) + { + out << "" << endl; + out << tmpstr; + out << "" << endl; + } + thisDir.remove(baseName+".map"); + } + } + else if (format==EPS) + { + // run dot to create a .eps image + QCString dotArgs(maxCmdLine); + dotArgs.sprintf("-Tps \"%s.dot\" -o \"%s.eps\"", + baseName.data(),baseName.data()); + if (iSystem(Config_getString("DOT_PATH")+"dot",dotArgs)!=0) + { + err("Problems running dot. Check your installation!\n"); + QDir::setCurrent(oldDir); + return baseName; + } + int width,height; + if (!readBoundingBoxEPS(baseName+".eps",&width,&height)) + { + err("Error: Could not extract bounding box from .eps!\n"); + QDir::setCurrent(oldDir); + return baseName; + } + if (Config_getBool("USE_PDFLATEX")) + { + QCString epstopdfArgs(maxCmdLine); + epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"", + baseName.data(),baseName.data()); + if (iSystem("epstopdf",epstopdfArgs,TRUE)!=0) + { + err("Error: Problems running epstopdf. Check your TeX installation!\n"); + QDir::setCurrent(oldDir); + return baseName; + } + } + int maxWidth = 420; /* approx. page width in points */ + + out << "\\begin{figure}[H]\n" + "\\begin{center}\n" + "\\leavevmode\n" + "\\includegraphics[width=" << QMIN(width/2,maxWidth) + << "pt]{" << baseName << "}\n" + "\\end{center}\n" + "\\end{figure}\n"; + } + + if (Config_getBool("DOT_CLEANUP")) thisDir.remove(baseName+".dot"); + + QDir::setCurrent(oldDir); + return baseName; +} + +void DotCallGraph::buildGraph(DotNode *n,MemberDef *md,int distance) +{ + MemberSDict *refs = md->getReferencesMembers(); + if (refs) + { + MemberSDict::Iterator mri(*refs); + MemberDef *rmd; + for (;(rmd=mri.current());++mri) + { + if (rmd->isFunction()) + { + QCString uniqueId; + if (rmd->getGroupDef()) // member is in a group + { + uniqueId = rmd->getReference()+"$"+ + rmd->getGroupDef()->getOutputFileBase()+"#"+rmd->getBodyAnchor(); + } + else // ungrouped member + { + uniqueId=rmd->getReference()+"$"+ + rmd->getOutputFileBase()+"#"+rmd->anchor(); + } + DotNode *bn = m_usedNodes->find(uniqueId); + if (bn) // file is already a node in the graph + { + n->addChild(bn,0,0,0); + bn->addParent(n); + bn->setDistance(distance); + } + else + { + bn = new DotNode( + m_curNodeNumber++, + rmd->qualifiedName(), + uniqueId, + distance + ); + if (distance>m_maxDistance) m_maxDistance=distance; + n->addChild(bn,0,0,0); + bn->addParent(n); + m_usedNodes->insert(uniqueId,bn); + + // we use <=, i.s.o < to cause one more level than intended which is used to + // detect truncated nodes + if (distance<=m_recDepth) buildGraph(bn,rmd,distance+1); + } + } + } + } +} + +bool DotCallGraph::isTrivial() const +{ + return m_startNode->m_children==0; +} + +//------------------------------------------------------------- + void generateGraphLegend(const char *path) { QFile dotFile((QCString)path+"/graph_legend.dot"); diff --git a/src/dot.h b/src/dot.h index e3246fb..1723e36 100644 --- a/src/dot.h +++ b/src/dot.h @@ -29,6 +29,7 @@ class FileDef; class QTextStream; class DotNodeList; class ClassSDict; +class MemberDef; enum GraphOutputFormat { BITMAP , EPS }; @@ -48,7 +49,7 @@ struct EdgeInfo class DotNode { public: - enum GraphType { Dependency, Inheritance, Collaboration, Hierarchy }; + enum GraphType { Dependency, Inheritance, Collaboration, Hierarchy, CallGraph }; DotNode(int n,const char *lab,const char *url,int distance = 0,bool rootNode=FALSE,ClassDef *cd=0); ~DotNode(); void addChild(DotNode *n, @@ -96,6 +97,7 @@ class DotNode friend class DotClassGraph; friend class DotInclDepGraph; friend class DotNodeList; + friend class DotCallGraph; friend void writeDotGraph( DotNode *root, GraphType gt, @@ -175,6 +177,25 @@ class DotInclDepGraph int m_recDepth; }; +class DotCallGraph +{ + public: + DotCallGraph(MemberDef *md,int maxRecursionDepth); + ~DotCallGraph(); + QCString writeGraph(QTextStream &t, GraphOutputFormat f, + const char *path,bool writeImageMap=TRUE); + void buildGraph(DotNode *n,MemberDef *md,int distance); + bool isTrivial() const; + + private: + DotNode *m_startNode; + static int m_curNodeNumber; + QDict *m_usedNodes; + int m_maxDistance; + int m_recDepth; + QCString m_diskName; +}; + void generateGraphLegend(const char *path); void writeDotGraphFromFile(const char *inFile,const char *outDir, const char *outFile,GraphOutputFormat format); diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 748a490..6901325 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -110,6 +110,7 @@ NamespaceDef *Doxygen::globalScope = new NamespaceDef("",1," *Doxygen::xrefLists = new QDict; // dictionary of cross-referenced item lists +bool Doxygen::parseSourcesNeeded = FALSE; static StringList inputFiles; static StringDict excludeNameDict(1009); // sections @@ -1262,6 +1263,7 @@ static void findUsingDeclImports(Entry *root) newMd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine()); } newMd->setDefinition(md->definition()); + newMd->enableCallGraph(root->callGraph); newMd->setBitfields(md->bitfieldString()); newMd->addSectionsToDefinition(root->anchors); newMd->setBodySegment(md->getStartBodyLine(),md->getEndBodyLine()); @@ -1420,6 +1422,7 @@ static MemberDef *addVariableToClass( md->setMaxInitLines(root->initLines); md->setMemberGroupId(root->mGrpId); md->setMemberSpecifiers(root->memSpec); + md->enableCallGraph(root->callGraph); addMemberToGroups(root,md); //if (root->mGrpId!=-1) //{ @@ -1588,6 +1591,7 @@ static MemberDef *addVariableToFile( md->setMemberGroupId(root->mGrpId); md->setBodyDef(fd); md->setDefinition(def); + md->enableCallGraph(root->callGraph); md->setExplicitExternal(root->explicitExternal); addMemberToGroups(root,md); //if (root->mGrpId!=-1) @@ -2061,6 +2065,7 @@ static void addMethodToClass(Entry *root,ClassDef *cd, } if (def.left(7)=="friend ") def=def.right(def.length()-7); md->setDefinition(def); + md->enableCallGraph(root->callGraph); Debug::print(Debug::Functions,0, " Func Member:\n" @@ -2267,6 +2272,8 @@ static void buildFunctionList(Entry *root) md->addSectionsToDefinition(root->anchors); + md->enableCallGraph(md->hasCallGraph() || root->callGraph); + // merge ingroup specifiers if (md->getGroupDef()==0 && root->groups->first()) { @@ -2350,6 +2357,7 @@ static void buildFunctionList(Entry *root) def.data() ); md->setDefinition(def); + md->enableCallGraph(root->callGraph); //if (root->mGrpId!=-1) //{ // md->setMemberGroup(memberGroupDict[root->mGrpId]); @@ -2486,6 +2494,9 @@ static void findFriends() fmd->setBodyMember(mmd); } mmd->setDocsForDefinition(fmd->isDocsForDefinition()); + + mmd->enableCallGraph(mmd->hasCallGraph() || fmd->hasCallGraph()); + fmd->enableCallGraph(mmd->hasCallGraph() || fmd->hasCallGraph()); } } } @@ -2643,6 +2654,9 @@ static void transferFunctionDocumentation() mdef->setMemberDeclaration(mdec); mdec->setMemberDefinition(mdef); + + mdef->enableCallGraph(mdec->hasCallGraph() || mdef->hasCallGraph()); + mdec->enableCallGraph(mdec->hasCallGraph() || mdef->hasCallGraph()); } } } @@ -3760,6 +3774,7 @@ static void addMemberDocs(Entry *root, // strip extern specifier if (fDecl.left(7)=="extern ") fDecl=fDecl.right(fDecl.length()-7); md->setDefinition(fDecl); + md->enableCallGraph(root->callGraph); ClassDef *cd=md->getClassDef(); NamespaceDef *nd=md->getNamespaceDef(); QCString fullName; @@ -3857,6 +3872,8 @@ static void addMemberDocs(Entry *root, md->setRefItems(root->sli); } + md->enableCallGraph(md->hasCallGraph() || root->callGraph); + //md->setDefFile(root->fileName); //md->setDefLine(root->startLine); md->mergeMemberSpecifiers(root->memSpec); @@ -4701,6 +4718,7 @@ static void findMember(Entry *root, } md->setMemberClass(cd); md->setDefinition(funcDecl); + md->enableCallGraph(root->callGraph); QCString doc=getOverloadDocs(); doc+="

    "; doc+=root->doc; @@ -4855,6 +4873,7 @@ static void findMember(Entry *root, md->setMemberClass(cd); md->setMemberSpecifiers(root->memSpec); md->setDefinition(funcDecl); + md->enableCallGraph(root->callGraph); md->setDocumentation(root->doc,root->docFile,root->docLine); md->setDocsForDefinition(!root->proto); md->setPrototype(root->proto); @@ -5112,6 +5131,7 @@ static void findEnums(Entry *root) // root->name.data(),root->bodyLine,root->fileName.data(),root->protection); md->addSectionsToDefinition(root->anchors); md->setMemberGroupId(root->mGrpId); + md->enableCallGraph(root->callGraph); //if (root->mGrpId!=-1) //{ // md->setMemberGroup(memberGroupDict[root->mGrpId]); @@ -5534,6 +5554,12 @@ static void generateFileSources() msg("Generating code for file %s...\n",fd->docName().data()); fd->writeSource(*outputList); } + else if (!fd->isReference() && + (Doxygen::parseSourcesNeeded || Config_getBool("CALL_GRAPH"))) + { + msg("Parsing code for file %s...\n",fd->docName().data()); + fd->parseSource(); + } } } } @@ -6405,7 +6431,7 @@ static void generateSearchIndex() QTextStream t(&f); t << "#!/bin/sh" << endl << "DOXYSEARCH=" << Config_getString("BIN_ABSPATH") << "/doxysearch" << endl - << "DOXYPATH=" << Config_getString("DOC_ABSPATH") << " "; + << "DOXYPATH=\"" << Config_getString("DOC_ABSPATH") << " "; QStrList &extDocPaths=Config_getList("EXT_DOC_PATHS"); char *s= extDocPaths.first(); @@ -6415,7 +6441,7 @@ static void generateSearchIndex() s=extDocPaths.next(); } - t << endl + t << "\"" << endl << "if [ -f $DOXYSEARCH ]" << endl << "then" << endl << " $DOXYSEARCH $DOXYPATH" << endl diff --git a/src/doxygen.h b/src/doxygen.h index 59c2f05..5b85dc7 100644 --- a/src/doxygen.h +++ b/src/doxygen.h @@ -93,6 +93,7 @@ class Doxygen static NamespaceDef *globalScope; static QDict *xrefLists; // array of xref lists: todo, test, bug, deprecated ... static QCString htmlFileExtension; + static bool parseSourcesNeeded; }; void initDoxygen(); diff --git a/src/entry.cpp b/src/entry.cpp index 041c7ee..ef3c92f 100644 --- a/src/entry.cpp +++ b/src/entry.cpp @@ -81,6 +81,7 @@ Entry::Entry(const Entry &e) memSpec = e.memSpec; initializer = e.initializer; initLines = e.initLines; + callGraph = e.callGraph; //todoId = e.todoId; //testId = e.testId; //bugId = e.bugId; @@ -240,6 +241,7 @@ void Entry::reset() bodyLine = -1; endBodyLine = -1; mGrpId = -1; + callGraph = FALSE; //todoId = 0; //testId = 0; //bugId = 0; diff --git a/src/entry.h b/src/entry.h index 9b8489e..7e77db2 100644 --- a/src/entry.h +++ b/src/entry.h @@ -27,7 +27,7 @@ enum MethodTypes { Method, Signal, Slot, DCOP, Property, Event }; struct ListItemInfo { - const char *type; + QCString type; int itemId; }; @@ -253,6 +253,7 @@ class Entry int memSpec; //!< member specifiers int initLines; //!< define/variable initializer lines to show bool subGrouping; //!< automatically group class members? + bool callGraph; //!< do we need to draw the call graph? Specifier virt; //!< virtualness of the entry Entry *parent; //!< parent node in the tree QCString type; //!< member type diff --git a/src/filedef.cpp b/src/filedef.cpp index 78710fc..0e9104e 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -32,6 +32,25 @@ #include "docparser.h" //#include "xml.h" +class DevNullCodeDocInterface : public BaseCodeDocInterface +{ + public: + virtual void codify(const char *) {} + virtual void writeCodeLink(const char *,const char *, + const char *,const char *) {} + virtual void writeLineNumber(const char *,const char *, + const char *,int) {} + virtual void startCodeLine() {} + virtual void endCodeLine() {} + virtual void startCodeAnchor(const char *) {} + virtual void endCodeAnchor() {} + virtual void startFontClass(const char *) {} + virtual void endFontClass() {} + virtual void writeCodeAnchor(const char *) {} +}; + + + /*! create a new file definition, where \a p is the file path, \a the file name, and \a ref is an HTML anchor name if the file was read from a tag file or 0 otherwise @@ -487,6 +506,14 @@ void FileDef::writeSource(OutputList &ol) ol.enableAll(); } +void FileDef::parseSource() +{ + DevNullCodeDocInterface devNullIntf; + parseCode(devNullIntf,0, + fileToString(absFilePath(),Config_getBool("FILTER_SOURCE_FILES")), + FALSE,0,this + ); +} void FileDef::addMembersToMemberGroup() { diff --git a/src/filedef.h b/src/filedef.h index ce5adb3..13b3b2c 100644 --- a/src/filedef.h +++ b/src/filedef.h @@ -122,6 +122,7 @@ class FileDef : public Definition void writeDetailedDocumentation(OutputList &ol); void writeDocumentation(OutputList &ol); void writeSource(OutputList &ol); + void parseSource(); friend void generatedFileNames(); void insertMember(MemberDef *md); void insertClass(ClassDef *cd); diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp index 2385e3f..f196253 100644 --- a/src/ftvhelp.cpp +++ b/src/ftvhelp.cpp @@ -437,13 +437,17 @@ int FTVHelp::decContentsDepth() { //int i; for (i=0;i *nl = &m_indentNodes[m_indent]; - FTVNode *parent = nl->getLast(); - QList *children = &m_indentNodes[m_indent+1]; - while (!children->isEmpty()) + ASSERT(m_indent>0); + if (m_indent>0) { - parent->children.append(children->take(0)); + m_indent--; + QList *nl = &m_indentNodes[m_indent]; + FTVNode *parent = nl->getLast(); + QList *children = &m_indentNodes[m_indent+1]; + while (!children->isEmpty()) + { + parent->children.append(children->take(0)); + } } return m_indent; } diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 22a81a5..4fb2be5 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -198,6 +198,7 @@ void HtmlDocVisitor::visit(DocVerbatim *s) m_t << s->text(); break; case DocVerbatim::LatexOnly: + case DocVerbatim::XmlOnly: /* nothing */ break; } diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index d729f2b..3d6b79a 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -1053,6 +1053,15 @@ void HtmlGenerator::endInclDepGraph(DotInclDepGraph &g) g.writeGraph(t,BITMAP,Config_getString("HTML_OUTPUT")); } +void HtmlGenerator::startCallGraph() +{ +} + +void HtmlGenerator::endCallGraph(DotCallGraph &g) +{ + g.writeGraph(t,BITMAP,Config_getString("HTML_OUTPUT")); +} + void HtmlGenerator::writeGraphicalHierarchy(DotGfxHierarchyTable &g) { g.writeGraph(t,Config_getString("HTML_OUTPUT")); diff --git a/src/htmlgen.h b/src/htmlgen.h index 32c71ac..103a193 100644 --- a/src/htmlgen.h +++ b/src/htmlgen.h @@ -185,6 +185,8 @@ class HtmlGenerator : public OutputGenerator void endDotGraph(DotClassGraph &g); void startInclDepGraph(); void endInclDepGraph(DotInclDepGraph &g); + void startCallGraph(); + void endCallGraph(DotCallGraph &g); void writeGraphicalHierarchy(DotGfxHierarchyTable &g); void startTextBlock(bool) {} diff --git a/src/index.cpp b/src/index.cpp index 852143a..8e369f7 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -1298,6 +1298,7 @@ void writeAlphabeticalClassList(OutputList &ol) if (cd->isLinkableInProject() && cd->templateMaster()==0) { int index = getPrefixIndex(cd->className()); + //printf("name=%s index=%d\n",cd->className().data(),index); if (toupper(cd->className().at(index))!=startLetter) // new begin letter => new header { startLetter=toupper(cd->className().at(index)); @@ -2270,6 +2271,13 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,int level) { HtmlHelp *htmlHelp=0; FTVHelp *ftvHelp = 0; + if (level>20) + { + warn(gd->getDefFileName(),gd->getDefLine(), + "Warning: maximum nesting level exceeded for group %s: check for possible recursive group relation!\n",gd->name().data() + ); + return; + } bool &generateHtml = Config_getBool("GENERATE_HTML") ; bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP"); bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW"); @@ -2433,8 +2441,8 @@ void writeGroupTreeNode(OutputList &ol, GroupDef *gd,int level) md=members->next(); } - if(htmlHelp) htmlHelp->decContentsDepth(); - if(ftvHelp) ftvHelp->decContentsDepth(); + if(htmlHelp && !first) htmlHelp->decContentsDepth(); + if(ftvHelp && !first) ftvHelp->decContentsDepth(); } } diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index b3dc1d9..8b80907 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -252,6 +252,7 @@ void LatexDocVisitor::visit(DocVerbatim *s) m_t << "\\end{verbatim}\\normalsize" << endl; break; case DocVerbatim::HtmlOnly: + case DocVerbatim::XmlOnly: /* nothing */ break; case DocVerbatim::LatexOnly: @@ -295,8 +296,8 @@ void LatexDocVisitor::visit(DocInclude *inc) void LatexDocVisitor::visit(DocIncOperator *op) { - printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n", - op->type(),op->isFirst(),op->isLast(),op->text().data()); + //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n", + // op->type(),op->isFirst(),op->isLast(),op->text().data()); if (op->isFirst()) { if (!m_hide) m_t << "\n\n\\footnotesize\\begin{verbatim}"; diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 4612ed4..a82b854 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -1388,6 +1388,15 @@ void LatexGenerator::endInclDepGraph(DotInclDepGraph &g) g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT")); } +void LatexGenerator::startCallGraph() +{ +} + +void LatexGenerator::endCallGraph(DotCallGraph &g) +{ + g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT")); +} + void LatexGenerator::startDescription() { t << "\\begin{description}" << endl; diff --git a/src/latexgen.h b/src/latexgen.h index f3cf484..5570002 100644 --- a/src/latexgen.h +++ b/src/latexgen.h @@ -261,6 +261,8 @@ class LatexGenerator : public OutputGenerator void endDotGraph(DotClassGraph &); void startInclDepGraph(); void endInclDepGraph(DotInclDepGraph &); + void startCallGraph(); + void endCallGraph(DotCallGraph &); void writeGraphicalHierarchy(DotGfxHierarchyTable &) {} void startTextBlock(bool) {} diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index a94a3f7..3353182 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -198,8 +198,7 @@ void ManDocVisitor::visit(DocVerbatim *s) m_firstCol=TRUE; break; case DocVerbatim::HtmlOnly: - /* nothing */ - break; + case DocVerbatim::XmlOnly: case DocVerbatim::LatexOnly: /* nothing */ break; diff --git a/src/mangen.h b/src/mangen.h index 43da3f9..d628358 100644 --- a/src/mangen.h +++ b/src/mangen.h @@ -227,6 +227,8 @@ class ManGenerator : public OutputGenerator void endDotGraph(DotClassGraph &) {} void startInclDepGraph() {} void endInclDepGraph(DotInclDepGraph &) {} + void startCallGraph() {} + void endCallGraph(DotCallGraph &) {} void writeGraphicalHierarchy(DotGfxHierarchyTable &) {} void startTextBlock(bool) {} diff --git a/src/memberdef.cpp b/src/memberdef.cpp index f5ddf13..ffda3bd 100644 --- a/src/memberdef.cpp +++ b/src/memberdef.cpp @@ -31,6 +31,7 @@ #include "groupdef.h" #include "defargs.h" #include "docparser.h" +#include "dot.h" //#include "xml.h" @@ -282,6 +283,7 @@ MemberDef::MemberDef(const char *df,int dl, //scopeTAL=0; //membTAL=0; m_defTmpArgLists=0; + m_hasCallGraph = FALSE; initLines=0; type=t; if (mt==Typedef && type.left(8)=="typedef ") type=type.mid(8); @@ -1568,7 +1570,24 @@ void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol, //if (Config_getBool("EXTRACT_ALL") && !hasDocs) ol.enable(OutputGenerator::Latex); ol.popGeneratorState(); + if ((m_hasCallGraph || Config_getBool("CALL_GRAPH")) + && isFunction() && Config_getBool("HAVE_DOT") + ) + { + DotCallGraph callGraph(this,Config_getInt("MAX_DOT_GRAPH_DEPTH")); + if (!callGraph.isTrivial()) + { + msg("Generating call graph for function %s\n",qualifiedName().data()); + ol.disable(OutputGenerator::Man); + ol.newParagraph(); + ol.startCallGraph(); + //ol.parseText(theTranslator->trCallGraph()); + ol.endCallGraph(callGraph); + ol.enableAll(); + } + } } + } void MemberDef::warnIfUndocumented() @@ -1992,3 +2011,9 @@ void MemberDef::findSectionsInDocumentation() docFindSections(documentation(),this,0,docFile()); } +void MemberDef::enableCallGraph(bool e) +{ + m_hasCallGraph=e; + if (e) Doxygen::parseSourcesNeeded = TRUE; +} + diff --git a/src/memberdef.h b/src/memberdef.h index 9801ca0..544e58e 100644 --- a/src/memberdef.h +++ b/src/memberdef.h @@ -225,6 +225,10 @@ class MemberDef : public Definition //void setIndentDepth( int i) { indDepth=i; } //int indentDepth() { return indDepth; } + // callgraph related members + bool hasCallGraph() const { return m_hasCallGraph; } + void enableCallGraph(bool e); + bool visibleMemberGroup(bool hideNoHeader); MemberDef *templateMaster() const { return m_templateMaster; } @@ -292,6 +296,7 @@ class MemberDef : public Definition bool annScope; // member is part of an annoymous scope bool annUsed; bool annShown; + bool m_hasCallGraph; //int indDepth; // indentation depth for this member if inside an annonymous scope int maxInitLines; // when the initializer will be displayed int userInitLines; // result of explicit \hideinitializer or \showinitializer diff --git a/src/outputgen.h b/src/outputgen.h index 508534e..54be83a 100644 --- a/src/outputgen.h +++ b/src/outputgen.h @@ -29,6 +29,7 @@ class ClassDiagram; class DotClassGraph; class DotInclDepGraph; +class DotCallGraph; class DotGfxHierarchyTable; class DocNode; class MemberDef; @@ -334,6 +335,8 @@ class OutputGenerator : public BaseOutputDocInterface virtual void endDotGraph(DotClassGraph &g) = 0; virtual void startInclDepGraph() = 0; virtual void endInclDepGraph(DotInclDepGraph &g) = 0; + virtual void startCallGraph() = 0; + virtual void endCallGraph(DotCallGraph &g) = 0; virtual void writeGraphicalHierarchy(DotGfxHierarchyTable &g) = 0; virtual void startQuickIndexItem(const char *s,const char *l) = 0; virtual void endQuickIndexItem() = 0; diff --git a/src/outputlist.cpp b/src/outputlist.cpp index 3145e1f..2946fe9 100644 --- a/src/outputlist.cpp +++ b/src/outputlist.cpp @@ -197,6 +197,7 @@ void OutputList::parseDoc(const char *fileName,int startLine, const char *exampleName,SectionDict *sections) { int count=0; + OutputGenerator *og=outputs->first(); while (og) { @@ -205,9 +206,19 @@ void OutputList::parseDoc(const char *fileName,int startLine, } if (count==0) return; // no output formats enabled. - DocNode *root = validatingParseDoc(fileName,startLine, - clName,md,docStr,isExample,exampleName, - sections); + DocNode *root=0; + if (docStr.length()==0 || docStr.at(docStr.length()-1)=='\n') + { + root = validatingParseDoc(fileName,startLine, + clName,md,docStr,isExample,exampleName, + sections); + } + else + { + root = validatingParseDoc(fileName,startLine, + clName,md,docStr+"\n",isExample,exampleName, + sections); + } og=outputs->first(); while (og) @@ -314,6 +325,7 @@ FORALL1(char a1,a1) FORALL1(int a1,a1) FORALL1(DotClassGraph &a1,a1) FORALL1(DotInclDepGraph &a1,a1) +FORALL1(DotCallGraph &a1,a1) FORALL1(DotGfxHierarchyTable &a1,a1) FORALL1(SectionTypes a1,a1) #if defined(HAS_BOOL_TYPE) || defined(Q_HAS_BOOL_TYPE) diff --git a/src/outputlist.h b/src/outputlist.h index b96ab13..7cb663c 100644 --- a/src/outputlist.h +++ b/src/outputlist.h @@ -312,6 +312,10 @@ class OutputList : public OutputDocInterface { forall(&OutputGenerator::startInclDepGraph); } void endInclDepGraph(DotInclDepGraph &g) { forall(&OutputGenerator::endInclDepGraph,g); } + void startCallGraph() + { forall(&OutputGenerator::startCallGraph); } + void endCallGraph(DotCallGraph &g) + { forall(&OutputGenerator::endCallGraph,g); } void writeGraphicalHierarchy(DotGfxHierarchyTable &g) { forall(&OutputGenerator::writeGraphicalHierarchy,g); } void startTextBlock(bool dense=FALSE) @@ -376,6 +380,7 @@ class OutputList : public OutputDocInterface FORALLPROTO1(int); FORALLPROTO1(DotClassGraph &); FORALLPROTO1(DotInclDepGraph &); + FORALLPROTO1(DotCallGraph &); FORALLPROTO1(DotGfxHierarchyTable &); FORALLPROTO1(SectionTypes); #if defined(HAS_BOOL_TYPE) || defined(Q_HAS_BOOL_TYPE) diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 98fa326..2083622 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -619,6 +619,7 @@ void PerlModDocVisitor::visit(DocVerbatim *s) case DocVerbatim::Verbatim: type = "preformatted"; break; case DocVerbatim::HtmlOnly: type = "htmlonly"; break; case DocVerbatim::LatexOnly: type = "latexonly"; break; + case DocVerbatim::XmlOnly: type = "xmlonly"; break; } openItem(type); m_output.addFieldQuotedString("content", s->text()); diff --git a/src/pre.l b/src/pre.l index 95242db..0a766cb 100644 --- a/src/pre.l +++ b/src/pre.l @@ -1321,12 +1321,12 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) g_guardExpr="! "; BEGIN(DefinedExpr1); } -"if"/[ \t(] { +"if"/[ \t(!] { incrLevel(); g_guardExpr.resize(0); BEGIN(Guard); } -("elif"|"else"{B}*"if")/[ \t(] { +("elif"|"else"{B}*"if")/[ \t(!] { if (!otherCaseDone()) { g_guardExpr.resize(0); @@ -1354,7 +1354,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) "undef"{B}+ { BEGIN(UndefName); } -("elif"|"else"{B}*"if")/[ \t(] { +("elif"|"else"{B}*"if")/[ \t(!] { if (!otherCaseDone()) { g_guardExpr.resize(0); @@ -1445,7 +1445,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) ^{B}*"#" { BEGIN(SkipCommand); } ^{B}*/[^#] { BEGIN(SkipLine); } . -"if"(("n")?("def"))?/[ \t(] { +"if"(("n")?("def"))?/[ \t(!] { incrLevel(); g_ifcount++; //printf("#if... depth=%d\n",g_ifcount); @@ -1459,7 +1459,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) BEGIN(Start); } } -("elif"|"else"{B}*"if")/[ \t(] { +("elif"|"else"{B}*"if")/[ \t(!] { if (g_ifcount==0) { if (!otherCaseDone()) diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index 4b69abe..ac1febb 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -304,9 +304,8 @@ void RTFDocVisitor::visit(DocVerbatim *s) m_t << "}" << endl; break; case DocVerbatim::HtmlOnly: - /* nothing */ - break; case DocVerbatim::LatexOnly: + case DocVerbatim::XmlOnly: /* nothing */ break; } diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp index 346a8cd..3c5d7a3 100644 --- a/src/rtfgen.cpp +++ b/src/rtfgen.cpp @@ -2223,6 +2223,27 @@ void RTFGenerator::endInclDepGraph(DotInclDepGraph &g) DBG_RTF(t << "{\\comment (endInclDepGraph)}" << endl) } +void RTFGenerator::startCallGraph() +{ + DBG_RTF(t << "{\\comment (startCallGraph)}" << endl) +} + +void RTFGenerator::endCallGraph(DotCallGraph &g) +{ + newParagraph(); + + QCString fileName = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),FALSE); + + // display the file + t << "{" << endl; + t << rtf_Style_Reset << endl; + t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE "; + t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT"); + t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl; + t << "}" << endl; + DBG_RTF(t << "{\\comment (endCallGraph)}" << endl) +} + /** Tests the integrity of the result by counting brackets. * */ diff --git a/src/rtfgen.h b/src/rtfgen.h index d85b8c7..099ca31 100644 --- a/src/rtfgen.h +++ b/src/rtfgen.h @@ -223,6 +223,8 @@ class RTFGenerator : public OutputGenerator void endDotGraph(DotClassGraph &); void startInclDepGraph(); void endInclDepGraph(DotInclDepGraph &); + void startCallGraph(); + void endCallGraph(DotCallGraph &); void writeGraphicalHierarchy(DotGfxHierarchyTable &) {} void startMemberGroupHeader(bool); diff --git a/src/scanner.l b/src/scanner.l index 0cf4f97..9a7ad66 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -289,23 +289,30 @@ static void addXRefItem(const char *listName,const char *itemTitle,const char *l { if (listName==0) return; + //printf("addXRefItem(%s,%s,%s)\n",listName,itemTitle,listTitle); ListItemInfo *lii=0; RefList *refList = Doxygen::xrefLists->find(listName); if (refList==0) // new list { refList = new RefList(listName,listTitle,itemTitle); Doxygen::xrefLists->insert(listName,refList); + //printf("new list!\n"); } if (current->sli) { QListIterator slii(*current->sli); for (slii.toFirst();(lii=slii.current());++slii) { - if (strcmp(lii->type,listName)==0) break; + if (strcmp(lii->type,listName)==0) + { + //printf("found %s lii->type=%s\n",listName,lii->type); + break; + } } } if (lii) // already found item of same type before { + //printf("listName=%s item id = %d\n",listName,lii->itemId); RefItem *item = refList->getRefItem(lii->itemId); ASSERT(item!=0); item->text += "

    "; @@ -315,6 +322,7 @@ static void addXRefItem(const char *listName,const char *itemTitle,const char *l else // new item { int itemId = refList->addRefItem(); + //printf("listName=%s item id = %d\n",listName,itemId); char anchorLabel[1024]; sprintf(anchorLabel,"_%s%06d",listName,itemId); RefItem *item = refList->getRefItem(itemId); @@ -484,7 +492,7 @@ static int yyread(char *buf,int max_size) /* start command character */ CMD ("\\"|"@") -SECTIONCMD {CMD}("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"xrefitem"|"ingroup"|"latexonly"|"htmlonly"|"{"|"verbatim"|"dotfile"|"defgroup"|"addtogroup"|"weakgroup"|"class"|"namespace"|"union"|"struct"|"fn"|"var"|"typedef"|"def"|"overload")|("<"{PRE}">") +SECTIONCMD {CMD}("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"xrefitem"|"ingroup"|"callgraph"|"latexonly"|"htmlonly"|"xmlonly"|"{"|"verbatim"|"dotfile"|"defgroup"|"addtogroup"|"weakgroup"|"class"|"namespace"|"union"|"struct"|"fn"|"var"|"typedef"|"def"|"overload")|("<"{PRE}">") BN [ \t\n\r] BL [ \t\r]*"\n" B [ \t] @@ -1365,7 +1373,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] current->bodyLine = yyLineNr; BEGIN( Define ); } -{B}*"#"{B}+[0-9]+{B}+/"\"" { /* line control directive */ +{B}*"#"{B}+[0-9]+{B}+/"\"" { /* line control directive */ yyLineNr = atoi(&yytext[1]); //printf("setting line number to %d\n",yyLineNr); lastPreLineCtrlContext = YY_START; @@ -3900,7 +3908,7 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] pSkipDoc=¤t->brief; BEGIN(SkipCode); } -{CMD}("endverbatim"|"endlatexonly"|"endhtmlonly")/[^a-z_A-Z0-9] { +{CMD}("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly")/[^a-z_A-Z0-9] { current->doc+=yytext; BEGIN(lastVerbState); } @@ -4016,13 +4024,13 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] ("\\\\"|"@@")"f"[$\[\]] { current->doc += yytext; } -{CMD}"f$" { +{CMD}"f$" { lastFormulaContext = YY_START; formulaText="$"; insideFormula=TRUE; BEGIN(ReadFormulaShort); } -{CMD}"f[" { +{CMD}"f[" { lastFormulaContext = YY_START; formulaText="\\["; insideFormula=TRUE; @@ -4036,9 +4044,18 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] lastFormulaContext==AfterDocBrief || lastFormulaContext==AfterDocLine ) + { current->brief += addFormula(); + } + else if (lastFormulaContext==CopyArgComment || + lastFormulaContext==CopyArgCommentLine) + { + fullArgString += addFormula(); + } else + { current->doc += addFormula(); + } insideFormula=FALSE; BEGIN(lastFormulaContext); } @@ -4062,9 +4079,18 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] lastFormulaContext==AfterDocBrief || lastFormulaContext==AfterDocLine ) + { current->brief += addFormula(); + } + else if (lastFormulaContext==CopyArgComment || + lastFormulaContext==CopyArgCommentLine) + { + fullArgString += addFormula(); + } else + { current->doc += addFormula(); + } insideFormula=FALSE; BEGIN(lastFormulaContext); } @@ -4251,6 +4277,9 @@ PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;] {CMD}"hideinitializer"/[^a-z_A-Z0-9] { current->initLines = 0; // OFF } +{CMD}"callgraph"/[^a-z_A-Z0-9] { + current->callGraph = TRUE; // ON + } {ID} { current->groups->append( new Grouping(yytext, Grouping::GROUPING_INGROUP) diff --git a/src/translator_fr.h b/src/translator_fr.h index 4e6ffe3..8a30f2d 100644 --- a/src/translator_fr.h +++ b/src/translator_fr.h @@ -45,8 +45,6 @@ * -------------+------------------------------------------------------------ * 2003-03-29 | Update for new since 1.3 * -------------+------------------------------------------------------------ - * 2003-03-29 | Changed fonction into m‚thode. - * -------------+------------------------------------------------------------ */ #ifndef TRANSLATOR_FR_H #define TRANSLATOR_FR_H @@ -83,35 +81,35 @@ class TranslatorFrench : public Translator /*! used in the compound documentation before a list of related functions. */ QCString trRelatedFunctions() - { return "Fonctions associ‚es"; } + { return "Fonctions associées"; } /*! subscript for the related functions. */ QCString trRelatedSubscript() - { return "(Noter que ces fonctions ne sont pas des m‚thodes de la classe)"; } + { return "(Noter que ces fonctions ne sont pas des méthodes de la classe)"; } /*! header that is put before the detailed description of files, classes and namespaces. */ QCString trDetailedDescription() - { return "Description d‚taill‚e"; } + { return "Description détaillée"; } /*! header that is put before the list of typedefs. */ QCString trMemberTypedefDocumentation() - { return "Documentation des types imbriqu‚s"; } + { return "Documentation des types imbriqués"; } /*! header that is put before the list of enumerations. */ QCString trMemberEnumerationDocumentation() - { return "Documentation des ‚num‚rations imbriqu‚es"; } + { return "Documentation des énumérations imbriquées"; } /*! header that is put before the list of member functions. */ QCString trMemberFunctionDocumentation() - { return "Documentation des m‚thodes"; } + { return "Documentation des méthodes"; } /*! header that is put before the list of member attributes. */ QCString trMemberDataDocumentation() - { return "Documentation des donn‚es imbriqu‚es"; } + { return "Documentation des données imbriquées"; } /*! this is the text of a link put after brief descriptions. */ QCString trMore() - { return "Plus de d‚tails..."; } + { return "Plus de détails..."; } /*! put in the class documentation */ QCString trListOfAllMembers() @@ -123,33 +121,33 @@ class TranslatorFrench : public Translator /*! this is the first part of a sentence that is followed by a class name */ QCString trThisIsTheListOfAllMembers() - { return "Ceci est la liste complŠte des membres de "; } + { return "Ceci est la liste complète des membres de "; } /*! this is the remainder of the sentence after the class name */ QCString trIncludingInheritedMembers() - { return " y compris des membres des classes h‚rit‚es."; } + { return " y compris des membres des classes héritées."; } /*! 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="G‚n‚r‚ automatiquement par Doxygen"; + { QCString result="Généré automatiquement par Doxygen"; if (s) result+=(QCString)" pour "+s; - result+=" … partir du code source."; + result+=" à partir du code source."; return result; } /*! put after an enum name in the list of all members */ QCString trEnumName() - { return "‚num‚ration"; } + { return "énumération"; } /*! put after an enum value in the list of all members */ QCString trEnumValue() - { return "‚l‚ment d'une ‚num‚ration"; } + { return "élément d'une énumération"; } /*! put after an undocumented member in the list of all members */ QCString trDefinedIn() - { return "d‚fini dans"; } + { return "défini dans"; } // quick reference sections @@ -161,7 +159,7 @@ class TranslatorFrench : public Translator /*! This is put above each page as a link to the class hierarchy */ QCString trClassHierarchy() - { return "Hi‚rarchie des classes"; } + { return "Hiérarchie des classes"; } /*! This is put above each page as a link to the list of annotated classes */ QCString trCompoundList() @@ -173,7 +171,7 @@ class TranslatorFrench : public Translator /*! This is put above each page as a link to the list of all verbatim headers */ QCString trHeaderFiles() - { return "Fichiers d'en-tˆte"; } + { return "Fichiers d'en-tête"; } /*! This is put above each page as a link to all members of compounds. */ QCString trCompoundMembers() @@ -181,11 +179,11 @@ class TranslatorFrench : public Translator /*! This is put above each page as a link to all members of files. */ QCString trFileMembers() - { return "D‚clarations"; } + { return "Déclarations"; } /*! This is put above each page as a link to all related pages. */ QCString trRelatedPages() - { return "Pages associ‚es"; } + { return "Pages associées"; } /*! This is put above each page as a link to all examples. */ QCString trExamples() @@ -197,29 +195,29 @@ class TranslatorFrench : public Translator /*! This is an introduction to the class hierarchy. */ QCString trClassHierarchyDescription() - { return "Cette liste d'h‚ritage est, autant que possible, " - "class‚e par ordre alphab‚tique"; } + { return "Cette liste d'héritage est, autant que possible, " + "classée par ordre alphabétique"; } /*! This is an introduction to the list with all files. */ QCString trFileListDescription(bool extractAll) { QCString result="Liste de tous les fichiers "; - if (!extractAll) result+="document‚s "; - result+="avec une brŠve description :"; + if (!extractAll) result+="documentés "; + result+="avec une brève description :"; return result; } /*! This is an introduction to the annotated compound list. */ QCString trCompoundListDescription() { return "Liste des classes, des structures et des unions " - "avec une brŠve description :"; + "avec une brève description :"; } /*! This is an introduction to the page with all class members. */ QCString trCompoundMembersDescription(bool extractAll) { QCString result="Liste de tous les membres de classe "; - if (!extractAll) result+="document‚s "; + if (!extractAll) result+="documentés "; result+="avec les liens vers "; if (!extractAll) result+="la documentation de la classe correspondante :"; else result+="les classes auxquelles ils appartiennent :"; @@ -229,18 +227,18 @@ class TranslatorFrench : public Translator /*! This is an introduction to the page with all file members. */ QCString trFileMembersDescription(bool extractAll) { - QCString result="Liste de toutes les d‚clarations"; - if (!extractAll) result+="document‚es "; + QCString result="Liste de toutes les déclarations"; + if (!extractAll) result+="documentées "; result+="avec liens sur "; if (extractAll) result+="la documentation du fichier correspondant " "pour chacune :"; - else result+="les fichiers dans lesquels elles sont d‚finies :"; + else result+="les fichiers dans lesquels elles sont définies :"; return result; } /*! This is an introduction to the page with the list of all header files. */ QCString trHeaderFilesDescription() - { return "Liste de tous les fichiers d'en-tˆte constituant " + { return "Liste de tous les fichiers d'en-tête constituant " "l'interface de programmation :"; } /*! This is an introduction to the page with the list of all examples */ @@ -249,7 +247,7 @@ class TranslatorFrench : public Translator /*! This is an introduction to the page with the list of related pages */ QCString trRelatedPagesDescription() - { return "Liste de toutes les pages de documentation associ‚es :"; } + { return "Liste de toutes les pages de documentation associées :"; } /*! This is an introduction to the page with the list of class/file groups */ QCString trModulesDescription() @@ -278,7 +276,7 @@ class TranslatorFrench : public Translator * class hierarchy. */ QCString trHierarchicalIndex() - { return "Index hi‚rarchique"; } + { return "Index hiérarchique"; } /*! This is used in LaTeX as the title of the chapter with the * annotated compound index. @@ -324,13 +322,13 @@ class TranslatorFrench : public Translator /*! This is used in LaTeX as the title of the document */ QCString trReferenceManual() - { return "Manuel de r‚f‚rence"; } + { return "Manuel de référence"; } /*! This is used in the documentation of a file as a header before the * list of defines */ QCString trDefines() - { return "D‚finitions des macros"; } + { return "Définitions des macros"; } /*! This is used in the documentation of a file as a header before the * list of function prototypes @@ -342,13 +340,13 @@ class TranslatorFrench : public Translator * list of typedefs */ QCString trTypedefs() - { return "D‚finitions des types"; } + { return "Définitions des types"; } /*! This is used in the documentation of a file as a header before the * list of enumerations */ QCString trEnumerations() - { return "num‚rations"; } + { return "Énumérations"; } /*! This is used in the documentation of a file as a header before the * list of (global) functions @@ -366,7 +364,7 @@ class TranslatorFrench : public Translator * list of (global) variables */ QCString trEnumerationValues() - { return "l‚ments ‚num‚r‚s"; } + { return "Éléments énumérés"; } /*! This is used in the documentation of a file before the list of * documentation blocks for defines @@ -390,13 +388,13 @@ class TranslatorFrench : public Translator * of documentation blocks for enumeration types */ QCString trEnumerationTypeDocumentation() - { return "Documentation du type de l'‚num‚ration"; } + { return "Documentation du type de l'énumération"; } /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for enumeration values */ QCString trEnumerationValueDocumentation() - { return "Documentation de l'‚l‚ment de l'‚numeration"; } + { return "Documentation de l'élément de l'énumeration"; } /*! This is used in the documentation of a file/namespace before the list * of documentation blocks for functions @@ -421,7 +419,7 @@ class TranslatorFrench : public Translator */ QCString trGeneratedAt(const char *date,const char *projName) { - QCString result=(QCString)"G‚n‚r‚ le "+date; + QCString result=(QCString)"Généré le "+date; if (projName) result+=(QCString)" pour "+projName; result+=(QCString)" par "; return result; @@ -430,13 +428,13 @@ class TranslatorFrench : public Translator */ QCString trWrittenBy() { - return "‚crit par"; + return "écrit par"; } /*! this text is put before a class diagram */ QCString trClassDiagram(const char *clName) { - return (QCString)"Graphe d'h‚ritage de la classe "+clName; + return (QCString)"Graphe d'héritage de la classe "+clName; } /*! this text is generated when the \\internal command is used. */ @@ -445,8 +443,8 @@ class TranslatorFrench : public Translator /*! this text is generated when the \\reimp command is used. */ QCString trReimplementedForInternalReasons() - { return "Red‚fini pour des raisons internes; " - "l'interface n'est pas modifi‚e"; + { return "Redéfini pour des raisons internes; " + "l'interface n'est pas modifiée"; } /*! this text is generated when the \\warning command is used. */ @@ -471,11 +469,11 @@ class TranslatorFrench : public Translator /*! this text is generated when the \\sa command is used. */ QCString trSeeAlso() - { return "Voir ‚galement"; } + { return "Voir également"; } /*! this text is generated when the \\param command is used. */ QCString trParameters() - { return "ParamŠtres"; } + { return "Paramètres"; } /*! this text is generated when the \\exception command is used. */ QCString trExceptions() @@ -483,7 +481,7 @@ class TranslatorFrench : public Translator /*! this text is used in the title page of a LaTeX document. */ QCString trGeneratedBy() - { return "G‚n‚r‚ par"; } + { return "Généré par"; } // new since 0.49-990307 @@ -494,8 +492,8 @@ class TranslatorFrench : public Translator virtual QCString trNamespaceListDescription(bool extractAll) { QCString result="Liste de tous les namespaces "; - if (!extractAll) result+="document‚s "; - result+="avec une brŠve description :"; + if (!extractAll) result+="documentés "; + result+="avec une brève description :"; return result; } @@ -513,7 +511,7 @@ class TranslatorFrench : public Translator * related classes */ virtual QCString trRelatedFunctionDocumentation() - { return "Documentation des fonctions amies et associ‚es"; } + { return "Documentation des fonctions amies et associées"; } ////////////////////////////////////////////////////////////////////////// // new since 0.49-990425 @@ -524,7 +522,7 @@ class TranslatorFrench : public Translator ClassDef::CompoundType compType, bool /*isTemplate*/) { - QCString result="R‚f‚rence de "; + QCString result="Référence de "; switch(compType) { case ClassDef::Class: result+="la classe "; break; @@ -541,7 +539,7 @@ class TranslatorFrench : public Translator /*! used as the title of the HTML page of a file */ virtual QCString trFileReference(const char *fileName) { - QCString result= "R‚f‚rence du fichier "; + QCString result= "Référence du fichier "; result += fileName; return result; } @@ -549,7 +547,7 @@ class TranslatorFrench : public Translator /*! used as the title of the HTML page of a namespace */ virtual QCString trNamespaceReference(const char *namespaceName) { - QCString result= "R‚f‚rence du namespace "; + QCString result= "Référence du namespace "; result += namespaceName; return result; } @@ -564,17 +562,17 @@ class TranslatorFrench : public Translator virtual QCString trStaticPublicMembers() { return "Membres publics statiques"; } virtual QCString trProtectedMembers() - { return "Membres prot‚g‚s"; } + { return "Membres protégés"; } virtual QCString trProtectedSlots() - { return "Connecteurs prot‚g‚s"; } + { return "Connecteurs protégés"; } virtual QCString trStaticProtectedMembers() - { return "Membres prot‚g‚s statiques"; } + { return "Membres protégés statiques"; } virtual QCString trPrivateMembers() - { return "Membres priv‚s"; } + { return "Membres privés"; } virtual QCString trPrivateSlots() - { return "Connecteurs priv‚s"; } + { return "Connecteurs privés"; } virtual QCString trStaticPrivateMembers() - { return "Membres priv‚s statiques"; } + { return "Membres privés statiques"; } /*! this function is used to produce a comma-separated list of items. * use generateMarker(i) to indicate where item i should be put. @@ -606,7 +604,7 @@ class TranslatorFrench : public Translator */ virtual QCString trInheritsList(int numEntries) { - return "Est d‚riv‚e de "+trWriteList(numEntries)+"."; + return "Est dérivée de "+trWriteList(numEntries)+"."; } /*! used in class documentation to produce a list of super classes, @@ -614,7 +612,7 @@ class TranslatorFrench : public Translator */ virtual QCString trInheritedByList(int numEntries) { - return "D‚riv‚e par "+trWriteList(numEntries)+"."; + return "Dérivée par "+trWriteList(numEntries)+"."; } /*! used in member documentation blocks to produce a list of @@ -622,7 +620,7 @@ class TranslatorFrench : public Translator */ virtual QCString trReimplementedFromList(int numEntries) { - return "Red‚finie … partir de "+trWriteList(numEntries)+"."; + return "Redéfinie à partir de "+trWriteList(numEntries)+"."; } /*! used in member documentation blocks to produce a list of @@ -630,7 +628,7 @@ class TranslatorFrench : public Translator */ virtual QCString trReimplementedInList(int numEntries) { - return "Red‚finie dans "+trWriteList(numEntries)+"."; + return "Redéfinie dans "+trWriteList(numEntries)+"."; } /*! This is put above each page as a link to all members of namespaces. */ @@ -641,10 +639,10 @@ class TranslatorFrench : public Translator virtual QCString trNamespaceMemberDescription(bool extractAll) { QCString result="Voici une liste de tous les membres de namespace"; - if (!extractAll) result+="document‚s "; + if (!extractAll) result+="documentés "; result+=" avec liens vers "; if (extractAll) - result+="les documentations des namespaces associ‚s :"; + result+="les documentations des namespaces associés :"; else result+="les namespaces auxquels ils appartiennent :"; return result; @@ -682,7 +680,7 @@ class TranslatorFrench : public Translator bool single) { // here s is one of " Class", " Struct" or " Union" // single is true implies a single file - QCString result=(QCString)"La documentation associ‚e … cette "; + QCString result=(QCString)"La documentation associée à cette "; switch(compType) { case ClassDef::Class: result+="classe"; break; @@ -691,7 +689,7 @@ class TranslatorFrench : public Translator case ClassDef::Interface: result+="interface"; break; case ClassDef::Exception: result+="exception"; break; } - result+=" a ‚t‚ g‚n‚r‚e … partir "; + result+=" a été générée à partir "; if (single) result+=" du fichier suivant :"; else result+="des fichiers suivants :"; return result; @@ -702,7 +700,7 @@ class TranslatorFrench : public Translator */ virtual QCString trAlphabeticalList() { - return "Liste par ordre alphab‚tique"; + return "Liste par ordre alphabétique"; } @@ -712,7 +710,7 @@ class TranslatorFrench : public Translator /*! This is used as the heading text for the retval command. */ virtual QCString trReturnValues() - { return "Valeurs retourn‚es"; } + { return "Valeurs retournées"; } /*! This is in the (quick) index as a link to the main page (index.html) */ @@ -735,11 +733,11 @@ class TranslatorFrench : public Translator } virtual QCString trDefinedAtLineInSourceFile() { - return "D‚finition … la ligne @0 du fichier @1."; + return "Définition à la ligne @0 du fichier @1."; } virtual QCString trDefinedInSourceFile() { - return "D‚finition dans le fichier @0."; + return "Définition dans le fichier @0."; } ////////////////////////////////////////////////////////////////////////// // new since 0.49-991205 @@ -747,7 +745,7 @@ class TranslatorFrench : public Translator virtual QCString trDeprecated() { - return "ObsolŠte"; + return "Obsolète"; } ////////////////////////////////////////////////////////////////////////// @@ -762,7 +760,7 @@ class TranslatorFrench : public Translator /*! this text is put before an include dependency graph */ virtual QCString trInclDepGraph(const char *fName) { - return (QCString)"Graphe des d‚pendances par inclusion pour "+fName+":"; + return (QCString)"Graphe des dépendances par inclusion pour "+fName+":"; } /*! header that is put before the list of constructor/destructors. */ virtual QCString trConstructorDocumentation() @@ -777,12 +775,12 @@ class TranslatorFrench : public Translator /*! Used in the file sources to point to the corresponding documentation. */ virtual QCString trGotoDocumentation() { - return "Aller … la documentation de ce fichier."; + return "Aller à la documentation de ce fichier."; } /*! Text for the \\pre command */ virtual QCString trPrecondition() { - return "Pr‚condition"; + return "Précondition"; } /*! Text for the \\post command */ virtual QCString trPostcondition() @@ -806,15 +804,15 @@ class TranslatorFrench : public Translator } virtual QCString trGraphicalHierarchy() { - return "Diagramme hi‚rarchique des classes"; + return "Diagramme hiérarchique des classes"; } virtual QCString trGotoGraphicalHierarchy() { - return "Aller au diagramme hi‚rarchique des classes"; + return "Aller au diagramme hiérarchique des classes"; } virtual QCString trGotoTextualHierarchy() { - return "Aller … la hi‚rarchie des classes en texte"; + return "Aller à la hiérarchie des classes en texte"; } virtual QCString trPageIndex() { @@ -843,27 +841,27 @@ class TranslatorFrench : public Translator } virtual QCString trProtectedTypes() { - return "Types Prot‚g‚s"; + return "Types Protégés"; } virtual QCString trProtectedAttribs() { - return "Attributs Prot‚g‚s"; + return "Attributs Protégés"; } virtual QCString trStaticProtectedAttribs() { - return "Attributs Prot‚g‚s Statiques"; + return "Attributs Protégés Statiques"; } virtual QCString trPrivateTypes() { - return "Types Priv‚s"; + return "Types Privés"; } virtual QCString trPrivateAttribs() { - return "Attributs Priv‚s"; + return "Attributs Privés"; } virtual QCString trStaticPrivateAttribs() { - return "Attributs Priv‚s Statiques"; + return "Attributs Privés Statiques"; } ////////////////////////////////////////////////////////////////////////// @@ -878,7 +876,7 @@ class TranslatorFrench : public Translator /*! Used as the header of the todo list */ virtual QCString trTodoList() { - return "Liste des choses … faire"; + return "Liste des choses à faire"; } ////////////////////////////////////////////////////////////////////////// @@ -887,7 +885,7 @@ class TranslatorFrench : public Translator virtual QCString trReferencedBy() { - return "R‚f‚renc‚ par"; + return "Référencé par"; } virtual QCString trRemarks() { @@ -914,32 +912,32 @@ class TranslatorFrench : public Translator /*! title of the graph legend page */ virtual QCString trLegendTitle() { - return "L‚gende du graphe"; + return "Légende du graphe"; } /*! page explaining how the dot graph's should be interpreted */ virtual QCString trLegendDocs() { return - "Cette page explique comment interpr‚ter les graphes g‚n‚r‚s " + "Cette page explique comment interpréter les graphes générés " "par doxygen.

    \n" - "Consid‚rez l'exemple suivant:\n" + "Considérez l'exemple suivant:\n" "\\code\n" - "/*! Classe invisible … cause d'une troncature */\n" + "/*! Classe invisible à cause d'une troncature */\n" "class Invisible { };\n\n" - "/*! Classe tronqu‚e, la relation d'h‚ritage est masqu‚e */\n" + "/*! Classe tronquée, la relation d'héritage est masquée */\n" "class Truncated : public Invisible { };\n\n" - "/*! Classe non document‚e avec des commentaires Doxygen */\n" + "/*! Classe non documentée avec des commentaires Doxygen */\n" "class Undocumented { };\n\n" - "/*! Classe d‚riv‚e par h‚ritage public */\n" + "/*! Classe dérivée par héritage public */\n" "class PublicBase : public Truncated { };\n\n" - "/*! Classe d‚riv‚e par h‚ritage prot‚g‚ */\n" + "/*! Classe dérivée par héritage protégé */\n" "class ProtectedBase { };\n\n" - "/*! Classe d‚riv‚e par h‚ritage priv‚ */\n" + "/*! Classe dérivée par héritage privé */\n" "class PrivateBase { };\n\n" - "/*! Classe utilis‚e par la classe d‚riv‚e */\n" + "/*! Classe utilisée par la classe dérivée */\n" "class Used { };\n\n" - "/*! Super-classe qui h‚rite de plusieurs autres classes */\n" + "/*! Super-classe qui hérite de plusieurs autres classes */\n" "class Inherited : public PublicBase,\n" " protected ProtectedBase,\n" " private PrivateBase,\n" @@ -949,35 +947,35 @@ class TranslatorFrench : public Translator " Used *m_usedClass;\n" "};\n" "\\endcode\n" - "Si la valeur 200 est attribu‚e au tag \\c MAX_DOT_GRAPH_HEIGHT " - "du fichier de configuration, cela g‚nŠrera le graphe suivant:" + "Si la valeur 200 est attribuée au tag \\c MAX_DOT_GRAPH_HEIGHT " + "du fichier de configuration, cela génèrera le graphe suivant:" "

    \n" "

    \n" "Les rectangles du graphe ci-dessus ont la signification suivante:\n" "

      \n" - "
    • Un rectangle plein noir repr‚sente la structure ou la classe pour laquelle " - "le graphe est g‚n‚r‚.\n" - "
    • Un rectangle avec un bord noir indique une classe ou une structure document‚e.\n" - "
    • Un rectangle avec un bord gris indique une classe ou une structure non document‚e.\n" - "
    • Un rectangle avec un bord rouge indique une structure ou une classe document‚e\n" - "pour laquelle des relations d'h‚ritage ou de collaboration manquent. Un graphe est " - "tronqu‚ s'il ne rentre pas dans les limites sp‚cifi‚es." + "
    • Un rectangle plein noir représente la structure ou la classe pour laquelle " + "le graphe est généré.\n" + "
    • Un rectangle avec un bord noir indique une classe ou une structure documentée.\n" + "
    • Un rectangle avec un bord gris indique une classe ou une structure non documentée.\n" + "
    • Un rectangle avec un bord rouge indique une structure ou une classe documentée\n" + "pour laquelle des relations d'héritage ou de collaboration manquent. Un graphe est " + "tronqué s'il ne rentre pas dans les limites spécifiées." "
    \n" - "Les flŠches ont la signification suivante:\n" + "Les flèches ont la signification suivante:\n" "
      \n" - "
    • Une flŠche bleu fonc‚ est utilis‚e pour visualiser une relation d'h‚ritage public " + "
    • Une flèche bleu foncé est utilisée pour visualiser une relation d'héritage public " "entre deux classes.\n" - "
    • Une flŠche vert fonc‚ est utilis‚e pour une relation d'h‚ritage prot‚g‚.\n" - "
    • Une flŠche rouge fonc‚ est utilis‚e pour une relation d'h‚ritage priv‚.\n" - "
    • Une flŠche violette en pointill‚s est utilis‚e si une classe est contenue ou " - "utilis‚e par une autre classe. La flŠche est ‚tiquet‚e avec la ou les variable(s) " - "qui permettent d'acc‚der … la classe ou structure point‚e. \n" + "
    • Une flèche vert foncé est utilisée pour une relation d'héritage protégé.\n" + "
    • Une flèche rouge foncé est utilisée pour une relation d'héritage privé.\n" + "
    • Une flèche violette en pointillés est utilisée si une classe est contenue ou " + "utilisée par une autre classe. La flèche est étiquetée avec la ou les variable(s) " + "qui permettent d'accéder à la classe ou structure pointée. \n" "
    \n"; } /*! text for the link to the legend page */ virtual QCString trLegend() { - return "L‚gende"; + return "Légende"; } ////////////////////////////////////////////////////////////////////////// // new since 1.2.0 @@ -1001,7 +999,7 @@ class TranslatorFrench : public Translator /*! Used as a section header for KDE-2 IDL methods */ virtual QCString trDCOPMethods() { - return "M‚thodes DCOP"; + return "Méthodes DCOP"; } ////////////////////////////////////////////////////////////////////////// @@ -1011,12 +1009,12 @@ class TranslatorFrench : public Translator /*! Used as a section header for IDL properties */ virtual QCString trProperties() { - return "Propri‚t‚s"; + return "Propriétés"; } /*! Used as a section header for IDL property documentation */ virtual QCString trPropertyDocumentation() { - return "Documentation des propri‚t‚s"; + return "Documentation des propriétés"; } ////////////////////////////////////////////////////////////////////////// @@ -1033,7 +1031,7 @@ class TranslatorFrench : public Translator { if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) { - return "Structures de donn‚es"; + return "Structures de données"; } else { @@ -1053,7 +1051,7 @@ class TranslatorFrench : public Translator /*! The description of the package index page */ virtual QCString trPackageListDescription() { - return "Liste des paquetages avec une brŠve description (si disponible):"; + return "Liste des paquetages avec une brève description (si disponible):"; } /*! The link name in the Quick links header for each page */ virtual QCString trPackages() @@ -1244,7 +1242,7 @@ class TranslatorFrench : public Translator */ virtual QCString trReferences() { - return "R‚f‚rences"; + return "Références"; } ////////////////////////////////////////////////////////////////////////// // new since 1.2.13 @@ -1255,7 +1253,7 @@ class TranslatorFrench : public Translator */ virtual QCString trImplementedFromList(int numEntries) { - return "Impl‚mente "+trWriteList(numEntries)+"."; + return "Implémente "+trWriteList(numEntries)+"."; } /*! used in member documentation blocks to produce a list of @@ -1263,7 +1261,7 @@ class TranslatorFrench : public Translator */ virtual QCString trImplementedInList(int numEntries) { - return "Impl‚ment‚ dans "+trWriteList(numEntries)+"."; + return "Implémenté dans "+trWriteList(numEntries)+"."; } ////////////////////////////////////////////////////////////////////////// @@ -1275,7 +1273,7 @@ class TranslatorFrench : public Translator */ virtual QCString trRTFTableOfContents() { - return "Table des matiŠres"; + return "Table des matières"; } ////////////////////////////////////////////////////////////////////////// @@ -1287,7 +1285,7 @@ class TranslatorFrench : public Translator */ virtual QCString trDeprecatedList() { - return "Liste obsolŠte"; + return "Liste obsolète"; } ////////////////////////////////////////////////////////////////////////// @@ -1299,12 +1297,12 @@ class TranslatorFrench : public Translator */ virtual QCString trEvents() { - return "EvŠnements"; + return "Evènements"; } /*! Header used for the documentation section of a class' events. */ virtual QCString trEventDocumentation() { - return "Documentation des ‚vŠnements"; + return "Documentation des évènements"; } ////////////////////////////////////////////////////////////////////////// @@ -1322,14 +1320,14 @@ class TranslatorFrench : public Translator */ virtual QCString trPackageMembers() { - return "M‚thodes de paquetage"; + return "Fonctions de paquetage"; } /*! Used as a heading for a list of static Java class functions with * package scope. */ virtual QCString trStaticPackageMembers() { - return "M‚thodes statiques de paquetage"; + return "Fonctions statiques de paquetage"; } /*! Used as a heading for a list of Java class variables with package * scope. @@ -1345,6 +1343,7 @@ class TranslatorFrench : public Translator { return "Attributs statiques de paquetage"; } + }; diff --git a/src/util.cpp b/src/util.cpp index 741291c..c654cb7 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -3130,6 +3130,12 @@ void extractNamespaceName(const QCString &scopeName, namespaceName.resize(0); done: + if (className.isEmpty() && !namespaceName.isEmpty()) + { + // class and namespace with the same name, correct to return the class. + className=namespaceName.copy(); + namespaceName.resize(0); + } //printf("extractNamespace `%s' => `%s|%s'\n",scopeName.data(), // className.data(),namespaceName.data()); return; @@ -4009,6 +4015,7 @@ void filterLatexString(QTextStream &t,const char *str, case '\\': t << "\\(\\backslash\\)"; break; case '{': t << "\\{"; break; case '}': t << "\\}"; break; + case '_': t << "\\_"; break; default: { // Some languages use wide characters diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index 360d434..4320d17 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -185,6 +185,9 @@ void XmlDocVisitor::visit(DocVerbatim *s) filter(s->text()); m_t << ""; break; + case DocVerbatim::XmlOnly: + m_t << s->text(); + break; } } -- cgit v0.12